Compare commits

...

143 Commits

Author SHA1 Message Date
KoalaDev 66d650f49c docs: date v2.6.0 changelog release
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 05:13:43 +02:00
KoalaDev 2cde14b260 Merge pull request #28 from Shik3i/redesign/koala-nature-theme
Redesign the website and extension with the Koala nature theme
2026-07-15 05:03:48 +02:00
KoalaDev db8bf8f647 docs: remove em dashes from store copy 2026-07-15 04:58:51 +02:00
KoalaDev 81001f2890 docs: correct relay and self-hosting copy 2026-07-15 04:55:53 +02:00
KoalaDev 861ffc306a test(website): validate canonical relay URL 2026-07-15 04:53:29 +02:00
KoalaDev 6f6aac9c18 docs: refresh project documentation 2026-07-15 04:45:45 +02:00
KoalaDev e4984b2d03 fix(website): complete self-hosting example 2026-07-15 04:37:51 +02:00
KoalaDev 18205f6573 docs(website): expand AI project profile 2026-07-15 04:29:20 +02:00
KoalaDev a4bbddf3a4 fix(website): address accessibility audit findings 2026-07-15 04:23:14 +02:00
KoalaDev b577f06988 fix(website): restore light mode step numbers 2026-07-15 03:48:22 +02:00
KoalaDev 61514b9b6f fix(website): generate sitemap only in build output 2026-07-15 03:30:22 +02:00
Timo 62046acb81 fix(ci): preserve optional lockfile entries 2026-07-14 16:38:47 +02:00
Timo 8b6a1412cc fix(build): replace regex HTML minifier 2026-07-14 16:30:13 +02:00
Timo 6e5a790707 fix(website): restore GitHub hero button outline 2026-07-14 16:11:50 +02:00
Timo 0f4b1d7217 docs(release): prepare v2.6.0 changelog and sitemap 2026-07-14 13:58:24 +02:00
Timo af0da75d38 style(website): landing motion, interaction & layout polish
Feedback round (calmer, less "template/AI"):
- Dial back animated background motion globally (sway/leaf-drift halved,
  fewer falling leaves, gentler godrays/fireflies/light-sweep).
- Fire leaf confetti on click of real controls only (was pointerdown
  everywhere, which showered mobile users on every scroll).
- Remove hover lift/scale from non-interactive cards, screenshots and
  mascots so they no longer read as clickable.
- Fix mobile nav menu colours in the light theme (was a hard-coded dark
  panel with low-contrast links).
- Calm how-it-works steps 1-2 (no button pulse/shine/cursor bob); step 3
  keeps its lively sync animation. Remove the now-static "copied" toast
  from step 1 since it only made sense mid-animation.

UX audit follow-ups:
- Unify vertical rhythm with one section-padding scale; vertically centre
  the hero so space is balanced instead of pooling under the CTAs.
- Split the mixed "Why KoalaSync?" grid into use-case scenarios and a
  labelled "Features" subsection, and move the #features nav anchor there.
- Demote the hero GitHub CTA to a quiet text link (Chrome > Firefox >
  GitHub hierarchy); scale down oversized section mascots and give them a
  shared soft shadow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 02:43:05 +02:00
Timo 63414bfcdd fix: strip all parenthesized/bracketed leading numbers in tab title normalization 2026-07-12 17:54:54 +02:00
Timo af1b66c6b7 fix: support multi-digit plus notification badges while preserving large numeric titles 2026-07-12 17:43:20 +02:00
Timo cc96fc1771 fix: support (99+) style notification badges in tab title normalization 2026-07-12 17:29:33 +02:00
Timo 9e8a446d97 fix: resolve Episode Lobby stuck loading state and prevent triggers on non-episodic media 2026-07-12 16:57:06 +02:00
Timo b987d13612 fix(extension): localize theme and appearance tooltips and selector options 2026-07-12 14:54:00 +02:00
Timo c175364f9a chore(website): refresh generated assets 2026-07-12 13:13:47 +02:00
Timo 0168484382 style(extension): unify control system and accessibility 2026-07-12 13:04:23 +02:00
Timo 99ecf9c9a8 fix(extension): normalize primary action labels 2026-07-12 12:17:32 +02:00
Timo f58ab54f45 fix(extension): remove redundant status accent bar 2026-07-12 12:15:21 +02:00
Timo 104602edec fix(extension): unify status UX and theme design 2026-07-12 11:10:15 +02:00
Timo 9d6a3650c4 fix(extension): polish settings selects and dark palette 2026-07-12 11:02:14 +02:00
Timo 986b2a6e56 style(extension): redesign settings and color system 2026-07-12 10:59:19 +02:00
Timo fdf20b6bf6 style(website): declutter background and polish stacked hero on small screens
- thin out bamboo/leaf/firefly decor in tiers (<=1440 / <=1024 / <=768px)
  so nothing moves behind the text column and copy stays readable
- center the single-column hero below 1024px (text, koala, CTAs, trust
  line) and let the odd CTA button span the full grid row
- remove the periodic wind gusts; keep the constant gentle bamboo sway
- reword the German demo CTA to "Live-Demo ansehen"

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 10:59:00 +02:00
KoalaDev 3ce64b8c41 style(website): place footer-ram at top of footer and adjust vertical margins 2026-07-12 06:55:32 +02:00
KoalaDev 6f8bc40023 style(website): swap footer-ram above copyright and apply unified small disclaimer style 2026-07-12 06:53:21 +02:00
KoalaDev 6f203405f9 fix(website): restore missing footer-disclaimer class styling to landing-primary.css 2026-07-12 06:52:34 +02:00
KoalaDev 949075b267 style(website): optimize header scroll-shrink and clean up footer styles/hover effects 2026-07-12 06:50:37 +02:00
KoalaDev 4fb8e0f53a style(extension): apply UI/UX audit enhancements, consolidate footers, and style capsule badges 2026-07-12 06:38:26 +02:00
KoalaDev bd33ea4804 feat(extension): implement accordion mutual exclusion behavior for settings details categories 2026-07-12 06:31:24 +02:00
KoalaDev 9cd3fc1ee2 feat(extension): redesign settings tab into 4 collapsible accordion groups with chevron indicator and hover effects 2026-07-12 06:28:34 +02:00
KoalaDev 44f9a78bb0 perf(website): migrate forest parallax to native CSS scroll-driven animations, fix step contrast, and resolve forced reflows 2026-07-12 06:18:58 +02:00
KoalaDev e27319908d refactor(website): apply day/night sky palette variables to sync theater illustration and video canvas 2026-07-12 05:48:27 +02:00
KoalaDev af4ac943a9 Landing performance: flag font subset, responsive mascots, AVIF cache, HTML minify
- Flag font: ship a committed fontTools subset (43 KB, -45%) of
  TwemojiCountryFlags.woff2 with only the 15 flags the site uses, under a
  content-hashed name with a preload on every flag-bearing page. The build
  validates the subset against a manifest and fails when a new flag
  appears without regenerating (npm run subset-flags). JS subsetters
  (subset-font/harfbuzzjs) were rejected: their wasm builds silently drop
  the COLR/CPAL color tables, rendering all flags invisible.
- Responsive mascots: legal/join/404 pages served 434-500px sources for
  175-180px slots; the build now emits 180w/360w variants (AVIF 1x: ~7 KB
  vs ~22 KB) and the pages use srcset. Small logo spots (14-42px) now use
  the existing 64/128px variants instead of the 256px file.
- injectAvifPictures copies the img sizes attribute onto the AVIF
  <source>; without it Chrome mis-selects w-descriptor candidates and can
  drop the image entirely.
- AVIF conversion is cached by content hash (.avif-cache.json); the old
  mtime check never hit because copyDirSync refreshes mtimes, so every
  verify re-encoded all 26 files.
- HTML output is minified (comments + indentation, <pre> preserved,
  newlines kept for inline-script safety): index.html 121 KB -> 93 KB.
- unicode-range trimmed to U+1F1E6-1F1FF; tag-sequence flags fall through
  to the system emoji font.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 04:34:53 +02:00
KoalaDev 9fd4e870f3 Update theme test after film bird removal
The test still required 4 foreground film birds, but commit 16cb138
deliberately removed them all; now it guards against remnants instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 04:34:36 +02:00
KoalaDev 16cb138eeb Remove film birds; fix language pill highlight
Strip every bird from the demo mockups: both hero video tabs and both
step-3 player scenes lose the background flock (.film-birds) and the
foreground flapping bird (.film-hero-bird), plus all related CSS in
styles/demo.css and the dead style.legacy.css.

Language selector: the <select> was 30px narrower than its pill, so in
appearance:base-select the click/focus highlight covered only the inner
~110px ("half the box"). Move the padding from the container onto the
control so it fills the pill edge-to-edge; mirror the fix in the mobile
legal.css override.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 03:57:18 +02:00
KoalaDev 17c9da292c Fix Getting Started light theme 2026-07-12 03:37:07 +02:00
KoalaDev c7c124dac7 Improve animated film bird 2026-07-12 03:28:05 +02:00
KoalaDev ea0970df72 Guard landing CSS cascade stability 2026-07-11 18:10:59 +02:00
KoalaDev 7614534818 Restore landing CSS cascade stability 2026-07-11 16:11:31 +02:00
KoalaDev 72d4f04526 Split landing CSS by render priority 2026-07-11 15:48:09 +02:00
KoalaDev 7fea11de0a Polish extension and landing page UI 2026-07-11 11:21:47 +02:00
KoalaDev fbef3d180c Give light theme proper green bamboo and a frosted language pill
- Bamboo layers get their own light-mode recipes (fresh greens, visible
  segment rings, sheen) instead of dark-theme gradients faded to 45%
- Language selector pill: frosted white glass, light dropdown/picker
  (was hard-coded dark glass in both themes)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 10:24:18 +02:00
KoalaDev fecaa8b54d Fix bamboo parallax direction: layers follow the scroll, not oppose it
Scrolling down now moves all bamboo layers up-screen with the content
(near fastest, far slowest) instead of pushing them down against it.
Vertical overscan flipped from top (-70%) to bottom (-40%) so the
upward drift never exposes a gap at the viewport bottom.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 10:20:38 +02:00
KoalaDev 8175f82f0b Polish demo film, bamboo forest, popup a11y, and step-1 toast
- Demo mockup video: drifting clouds, shooting star, moon craters, bird
  flock, valley mist band, floating lantern instead of bouncing ball,
  stronger cinematic vignette
- Player controls: play/pause glyph, duration, buffered range, volume,
  HD badge, fullscreen icon
- Bamboo background: two faint centre trunks, segment rings on far
  stalks, wider near stalks with extra leaf, smaller blurred layers
  (240% -> 200%) and reduced blur radii for cheaper compositing
- Step-1 illustration: invite toast floats fully below the popup card
- Extension popup: label/for associations for all settings controls
- Demo video select: drop invalid inline SVG inside <option>

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 10:10:37 +02:00
Timo 04df35bbe6 Enhance forest scene with mid bamboo layer, butterflies, click confetti, and demo scene polish 2026-07-11 06:08:12 +02:00
KoalaDev 21383b8b9c Polish animated forest background 2026-07-10 20:42:54 +02:00
KoalaDev 9cddac47ef Make forest parallax continuous and add scroll-depth journey
The drift clamp saturated after ~2600px, so nothing moved on long
pages. The vertical drift now maps scroll progress (0..1 over the full
document) onto the stalks' overscan, so the parallax runs end to end.

Turn the background into a descent through the forest: god-ray light
shafts and the canopy fade out while a dusk tint, thicker mist, the
terracotta horizon glow and the fireflies fade in as you scroll down.
Fireflies additionally wander organically (independent translate
property composing with their scale pulse), and on hover-capable
devices the bamboo layers tilt subtly toward the cursor. All layers
animate transform/opacity only, rAF-throttled, reduced-motion safe.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:42:23 +02:00
KoalaDev 1f1844e99b Fix bamboo stalk taper and align stray colors to palette
The stalks used border-radius:50%, which renders a tall ellipse whose
ends taper to points, and unbounded parallax drift pushed them off the
bottom of the viewport on long pages. Rounded caps + 20% overscan +
a viewport-relative drift clamp keep them full-height while scrolling.

Sweep the remaining off-palette colors into the nature palette:
content-script overlays (slate grays), amber warnings/badges/star
accents (now terracotta) in popup, background badge and website
illustrations, and the support-heart red (now --danger).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:28:50 +02:00
KoalaDev aa52d319e1 Redesign website and extension with koala nature theme
v3.0.0 "The Greens Update" palette: forest-green oklch color system
(accent green + terracotta secondary) replaces the indigo/slate scheme
across the landing page and the extension popup/options. The blob
background becomes an animated bamboo forest overlay (parallax stalks,
falling leaves, canopy, ground mist, fireflies, light sweep, grain)
with prefers-reduced-motion support. Layout, structure and copy are
unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:18:40 +02:00
KoalaDev 05246ac485 Fix light mode step text contrast 2026-07-09 17:25:20 +02:00
KoalaDev 6412a9e6ff Unify website section canvas 2026-07-09 17:07:23 +02:00
KoalaDev ee1c2947ce Fix join mobile navigation toggle 2026-07-09 14:47:29 +02:00
KoalaDev df8133fb5b Avoid persisting passive language visits 2026-07-09 14:40:44 +02:00
KoalaDev e25ae25bbb Respect system theme on website 2026-07-09 14:38:09 +02:00
KoalaDev 1d049e1745 perf(website): fix startup forced reflow and adjust AVIF compression quality to 65 2026-07-09 05:12:46 +02:00
KoalaDev 6aa42668e9 feat(website): add SRI to scripts & styles and optimize hero image preload 2026-07-09 05:06:35 +02:00
KoalaDev 71fdea78f3 feat(website): optimize rendering performance and improve structured metadata 2026-07-09 04:53:07 +02:00
Timo 5b7ee654e4 fix(website): keep hero demo hint readable 2026-07-08 20:22:20 +02:00
KoalaDev 7718885511 seo(website): add comprehensive AI agent rules to .gitignore 2026-07-08 17:31:02 +02:00
KoalaDev 12bca85356 build(website): move locales translation utility to scripts/ and add validate-brand-names script 2026-07-08 17:28:11 +02:00
KoalaDev b4bf297a5b i18n(website): translate new alternatives pages in all languages and save translation script as workspace example 2026-07-08 17:26:41 +02:00
KoalaDev 1e417e3379 fix(website): wrap locale replacement values in function to prevent RegExp dollar replacement bugs 2026-07-08 16:59:04 +02:00
KoalaDev d7d795f076 build(website): integrate dynamic sitemap generation into main build script 2026-07-08 16:53:57 +02:00
KoalaDev a45cfb063e seo(website): regenerate sitemap.xml to index all alternatives and update llms.txt 2026-07-08 16:52:46 +02:00
KoalaDev ee28f9d275 fix(website): grammar in TwoSeven German locale 2026-07-08 16:51:08 +02:00
KoalaDev 21936e7f71 feat(website): add KoalaSync vs TwoSeven comparison page 2026-07-08 16:50:05 +02:00
KoalaDev a45e52c6ee feat(website): add KoalaSync vs Kosmi comparison page 2026-07-08 16:47:29 +02:00
KoalaDev a0b4f1a2bb feat(website): update Scener comparison with pricing and technical differences 2026-07-08 16:38:40 +02:00
KoalaDev 4a8fdfbe70 chore: remove obsolete LANDINGPAGE_UI_OVERHAUL_PLAN.md 2026-07-08 16:32:31 +02:00
KoalaDev 9127b1f8dd feat(website): add KoalaSync vs Scener comparison page 2026-07-08 16:27:04 +02:00
KoalaDev e3a27db611 docs: add v2.5.4 changelog entry 2026-07-08 16:26:17 +02:00
GitHub Action 861bb05ec2 chore(release): update versions to v2.5.4 [skip ci] 2026-07-08 14:25:32 +00:00
KoalaDev 9f02a47d98 feat(website): add KoalaSync vs Watch2Gether comparison page 2026-07-08 16:20:44 +02:00
KoalaDev c3827fa4b7 refactor: remove cloud storage providers from domains blacklist 2026-07-08 16:04:00 +02:00
KoalaDev 61ba32addf refactor: remove localhost from domains blacklist 2026-07-08 16:03:53 +02:00
KoalaDev 140e2c0d00 chore: clarify privacy and legal notice wording 2026-07-07 12:57:58 +02:00
KoalaDev cc53494cc0 Merge pull request #25 from Shik3i/landingpage-redesign
Landing page redesign and polish
2026-07-07 07:10:24 +02:00
KoalaDev fd3c3e6cdb fix: satisfy landing page resize observer lint 2026-07-07 06:28:34 +02:00
KoalaDev 7d6ca9fd68 fix: finish responsive landing page polish 2026-07-07 06:21:36 +02:00
KoalaDev 84526cf8e9 fix: complete website seo localization 2026-07-07 02:38:28 +02:00
KoalaDev c16bf30ad5 fix: persist theme and lighten demo mockup 2026-07-07 02:28:45 +02:00
KoalaDev e559b41c93 fix: polish light mode landing page 2026-07-07 02:12:40 +02:00
KoalaDev a9687219e0 fix: normalize mobile platform logos 2026-07-07 02:07:15 +02:00
KoalaDev dfe0b42252 fix: hide hero github cta on mobile 2026-07-07 02:05:31 +02:00
KoalaDev d29c842e96 fix: compact getting started section 2026-07-07 02:02:44 +02:00
KoalaDev 07839a907b fix: refine landing page responsive layout 2026-07-07 02:00:37 +02:00
KoalaDev 78efb04b6a feat: refine landing page demo experience 2026-07-07 01:49:25 +02:00
KoalaDev e093a8afae docs: refresh onboarding and examples 2026-07-06 17:31:24 +02:00
KoalaDev b8484f77d6 content: swap privacy tile for the unique Volume Leveling feature
The combined section's third feature tile was Privacy, which is already
covered by the hero trust line and the comparison table. Replace it with
Volume Leveling / Audio Compressor, a genuinely differentiating feature not
shown anywhere else on the page. Shorten its description to match the other
tiles (all 15 locales). The three tiles are now: 1-click invites, volume
leveling, universal HTML5 support.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 16:59:09 +02:00
KoalaDev 8d7b7f68f3 copy: shorten the Universal HTML5 Support feature description
Trim the long three-sentence blurb to a tight two-liner (platform list plus
the "only sync signals, never the video" reassurance) so it matches the other
tiles in the combined section. Applied to all 15 locales.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 16:51:14 +02:00
KoalaDev 2848a4450c fix: guarantee the three hero CTAs stay on one line
The headline column in the old narrow two-column range (769-1023px) was too
tight to fit the full "Add to X" label plus two more buttons, so GitHub wrapped
to a second row. The hero is now single-column below 1024px (headline gets the
full width, demo stacks under it, matching the demo's own breakpoint) and
two-column at >=1024px where the column is wide enough. GitHub button label
shortened to "GitHub" for extra margin. Verified one row at 769/900/1024/1280
and the mobile stack at 375px.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 16:47:37 +02:00
KoalaDev 4c519a81e0 a11y: hero demo passes WCAG contrast (Lighthouse 4x100 desktop)
- Remove the confusing, space-hungry "Episode Lobby" card from the mockup
- Give the decorative demo mockup a contrast-safe palette: accent shown as
  text uses a lighter indigo, and buttons with white text on a colour get
  darker shades, so every walkthrough state meets WCAG AA
- Drop the scroll-reveal fade from the above-the-fold hero demo; the fade
  briefly rendered its text at partial opacity, which axe caught as failing
  contrast on ~1 in 3 audits
- Mark the demo as decorative for assistive tech (aria-hidden + removed from
  tab order); mouse interaction is unchanged
- Darken the footer support pill so white text meets contrast

Desktop Lighthouse: 100/100/100/100 (stable across runs). Mobile: 100
a11y / best-practices / SEO; performance ~87 (throttled LCP, separate work).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 16:30:37 +02:00
KoalaDev db70828c82 feat: browser-aware CTAs, tidier hero demo, comparison guides link
- Hero CTAs: the install buttons are compact (just the browser name) so all
  three fit one line; JS detects the visitor's browser and expands that one
  to the full "Add to X" call to action. Unknown browsers stay compact.
- Hero demo: caption now sits directly under the two windows (absolutely
  positioned to the card cascade) instead of far below the tall scene. The
  scene keeps a fixed height that already fits the open popup, so the
  vertically centered hero never jumps when the popup toggles.
- The background window now also shows a (non-interactive) extension icon,
  making it clear both browsers have KoalaSync installed.
- Escape now also closes the demo popup.
- Added a link from the comparison table to the fuller alternatives/guides
  hub, localized in all 15 languages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:03:48 +02:00
KoalaDev fd0ad310ce fix: hero demo popup closes on any outside click, add close button
Outside-click handling was scoped to the demo scene, so clicks elsewhere
on the page left the popup open and it felt unclosable. A document-level
listener now collapses it from anywhere, like a real extension popup,
and the popup header gained an explicit close button next to the version
link (hidden in the static mobile mockup).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 03:23:15 +02:00
KoalaDev 917afd795e fix: bottom-anchor hero demo popup instead of oversizing the scene
Reserving the full 600px open-popup height pushed the H1 down on short
viewports. The scene now stays at 500px (below the left column height,
so it never drives the grid row) and the extension popup is anchored to
the scene bottom, growing upwards on open. Layout stays pixel-stable
when the walkthrough toggles the popup.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 03:10:18 +02:00
KoalaDev da681e9e3f fix: reserve open-popup height for hero demo scene
The scene animated its own height when the walkthrough toggled the
extension popup; with the vertically centered hero grid this re-centered
the left column and shifted everything below on mid-size screens. The
scene now always reserves the 600px open state, so toggling the popup
never reflows the page.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 21:56:37 +02:00
KoalaDev 37df4b267c feat: landing page redesign
- New hero headline "Turn any video into a watch party" with animated
  gradient highlight, sharper subtitle and quiet trust line under the CTAs
- Changelog badge redesigned as the koala's speech bubble (version and
  release date baked in at build time, no version.json fetch anymore)
- Light/dark theme toggle in the header (dark default, pre-paint via
  lang-init, full light theme across sections)
- Use cases and "Why KoalaSync" merged into one section with the three
  strongest feature tiles; question-mark koala moved to the FAQ
- FAQ and self-hosting setup collapsed by default via shared
  section-collapse component (hash deep links auto-open them)
- Compat/juggler section more compact
- og:image switched to the 1280x640 repository OpenGraph card (landing
  and join page), generated during build
- "watch party" keyword added to meta title/description in all 15 locales
- All em-dashes removed from user-facing copy

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 21:50:45 +02:00
KoalaDev 793248053c Merge pull request #24 from Shik3i/chore/email-koalastuff
chore: migrate contact emails to koalastuff.net
2026-07-03 23:50:05 +02:00
Timo (KoalaDev) 1aa95079cf chore: migrate all contact emails from koalamail.rocks to koalastuff.net 2026-07-03 23:44:04 +02:00
KoalaDev 0976e765c3 Merge pull request #23 from Kaia-Alenia/fix-cors-env
docs: Update Vix test status to full in TESTED_SERVICES.md
2026-07-03 18:51:25 +02:00
Kaia-Alenia ee2c284cb4 Merge remote-tracking branch 'origin/main' into fix-cors-env
# Conflicts:
#	docs/TESTED_SERVICES.md
2026-07-03 10:23:54 -06:00
Kaia-Alenia 883807afd7 docs: Update Vix test status to full in TESTED_SERVICES.md 2026-07-03 09:38:38 -06:00
KoalaDev 46b2004f78 Merge pull request #22 from Shik3i/landingpage-ui-overhaul
Landing page UI overhaul: new extension mockup, interactive demo, 3-step guide, hero fixes
2026-07-03 14:36:00 +02:00
Timo 3fd02246ab feat: Add llms.txt for AI crawler support
- Create website/llms.txt following llmstxt.org spec (H1, blockquote,
  H2 sections with link lists, Optional section)
- Include llms.txt in website build pipeline (generic files copy)
- Sections: Features, Download, Technical, Optional (alternatives,
  sitemap, privacy, imprint, join)
2026-07-03 14:26:15 +02:00
Timo 14c9ab1d5e fix: Ensure hero heading has minimum distance from fixed nav bar across all languages
- Change .hero from align-items:center to flex-start so content starts from top
- Increase padding-top in short-viewport media query (<=920px height) to
  clamp(7.5rem, 10vh, 9rem) from clamp(3.75rem, 6vh, 5.5rem) so it always
  clears the ~96px nav bar
- Fix pre-existing lint errors: remove unused variables demoFinishedByStory,
  firstTake; add website/www to eslint ignores
2026-07-03 14:02:47 +02:00
Timo 0127d62a49 Tighten hero demo layout 2026-07-03 13:09:11 +02:00
KoalaDev 2d94cc10e4 website: Fix popup not collapsing after demo walkthrough completes
Remove firstTake && !demoFinishedByStory guard from takeOver handler
so clicks outside the extension mockup always collapse the popup,
regardless of whether the automated walkthrough finished.
2026-07-03 12:43:59 +02:00
KoalaDev c5c140d31c website: Link label elements to their select elements via for/id attributes in mockups for better accessibility 2026-07-03 12:14:35 +02:00
KoalaDev 5a53abc636 website: Adjust extension-mockup wrapper height to 600px to display the leave room button without scrolling 2026-07-03 12:13:34 +02:00
KoalaDev f0328fb865 website: Fall back to static extension mockup on medium screens (768px to 1024px) to prevent overlapping in narrower columns 2026-07-03 12:11:30 +02:00
KoalaDev e1e18aa26c website: Completely hide hero extension mockup wrapper on all stacked viewport sizes (768px and below) 2026-07-03 12:09:16 +02:00
KoalaDev cece816e00 website: Completely hide hero extension demo mockup wrapper on mobile screens (480px and below) 2026-07-03 11:57:33 +02:00
KoalaDev 9690868e33 website: Add smooth FAQ accordion spring animation with rotation icon transition 2026-07-03 11:35:00 +02:00
KoalaDev cb6d7eb98c website: Reformat Step 2 illustration as a realistic vertical extension popup mockup in the Sync tab 2026-07-03 11:32:51 +02:00
KoalaDev ab6356c5ad website: Replace long series name with shorter alternatives and randomize season 1 episode numbers dynamically 2026-07-03 11:30:04 +02:00
KoalaDev 5460ac3a01 website: Add micro-animations including scroll progress bar, nav logo entrance spin, and button shine sweeps 2026-07-03 11:26:45 +02:00
KoalaDev 60c80ad7fb website: Synchronize and randomize mockup video titles, and fix Step 2 illustration to use realistic select video dropdown 2026-07-03 11:25:12 +02:00
KoalaDev c8df8b6d08 website: Redesign Step 2 browser mockup as video player + select dropdown, and redesign Step 3 mockups to display matching forest movie 2026-07-03 11:22:10 +02:00
KoalaDev 49712a7151 website: Bring lower browser mockup to foreground on hover 2026-07-03 11:20:28 +02:00
KoalaDev 23aa0c8a15 website: Fix Host Control mockup to use the actual 'Only I can control playback' toggle switch 2026-07-03 11:15:32 +02:00
KoalaDev ae3b837bb4 website: Add Host Control Mode interactive mockup to Bento Card 1 and update translations in all 15 locales 2026-07-03 11:12:23 +02:00
KoalaDev 14ab6b2d50 website: Restructure 3-step guide flowchart, swap illustrations, and rewrite translations in all 15 locales 2026-07-03 11:09:25 +02:00
KoalaDev 82b90d86a9 website: Rename mockup usernames to ChillCat and HappyDog across HTML, JS, and all 15 locales 2026-07-03 11:07:03 +02:00
KoalaDev 537c8f3c60 website: Visual polish of 3-step guide and description updates in 13 locales 2026-07-03 11:05:45 +02:00
KoalaDev 6b81668e16 website: Fix mockup animation sync/pausing and improve 3-step guide copy 2026-07-03 11:01:57 +02:00
KoalaDev d6a23f2eb5 website: Hero layout and mock walkthrough visual optimizations 2026-07-03 10:57:23 +02:00
KoalaDev 573847486b fix: hero CTAs invisible until scroll, seek animation skip, layout overhaul
- Remove data-reveal from hero h1/subtitle/mascot/cta-group/version-badge
  (critical above-fold content must never start hidden)
- Change IntersectionObserver rootMargin -150px to -30px, threshold 0.1 to 0.05
  (CTAs at ~530px were past the observer zone on laptops)
- Hero layout: align-items flex-start + padding-top 7.5rem for content at top
- Cards 62cqw to 70cqw, -3% offsets for dramatic overlap cascade
- Film animation: replace stick-figure walker with cinematic night scene
  (7 twinkling stars, glowing moon with drift, parallax mountains, firefly)
- Seek now restarts all film child animations via .demo-reset class toggle
  (was incorrectly resetting parent only — no visible jump)
- Add .demo-seek-sweep overlay + brightness flash during seek
- Video select: placeholder option ('Choose a video tab...') until story picks
- RATE 8 to 1 for realtime playback
- Version badge moved below download buttons
- All 15 locale files: add DEMO_SELECT_PLACEHOLDER key
2026-07-03 10:42:09 +02:00
KoalaDev e5a4032710 work in progress: UI overhaul updates, new logo, and localization translations 2026-07-03 10:01:15 +02:00
KoalaDev 44d452a82f docs: update and categorize all entries in docs/README.md 2026-07-02 22:58:19 +02:00
KoalaDev 82d0bd4eb8 docs: correct Netflix compatibility status from N/A to X 2026-07-02 22:54:32 +02:00
KoalaDev d3ca2a2378 docs: update tested services compatibility table and contribution guide 2026-07-02 22:51:08 +02:00
KoalaDev b7622a8347 Update feature_request.md 2026-07-02 18:30:37 +02:00
Timo 3a733934c5 fix(lint): add website/**/*.cjs files to Node globals configuration 2026-07-02 18:01:11 +02:00
Timo 25ad3e8d59 feat(website): add cross-platform indexnow submission script 2026-07-02 17:39:17 +02:00
Timo 223c3949d2 feat(website): auto-copy google and indexnow verification files during build 2026-07-02 17:38:15 +02:00
Timo 3392f0b3a7 docs: tighten v2.5.3 changelog wording 2026-07-02 17:16:15 +02:00
GitHub Action 72ea5d1ee9 chore(release): update versions to v2.5.3 [skip ci] 2026-07-02 14:59:12 +00:00
125 changed files with 23248 additions and 5914 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
name: 🚀 Feature Request
about: Suggest a new feature or enhancement for KoalaSync
title: ''
labels: enhancement
labels: feature
assignees: ''
---
+1 -5
View File
@@ -114,17 +114,13 @@ jobs:
sed -i "s/New v[0-9]\+\.[0-9]\+\.[0-9]\+ Release/New v$VERSION Release/g" README.md
echo " ✓ README.md -> v$VERSION"
# 7. website/sitemap.xml — lastmod dates
sed -i "s/<lastmod>[0-9-]*<\/lastmod>/<lastmod>$(date +%Y-%m-%d)<\/lastmod>/g" website/sitemap.xml
echo " ✓ website/sitemap.xml -> lastmod $(date +%Y-%m-%d)"
echo "Version injection complete."
- name: Commit and push version updates back to main
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add extension/manifest.base.json shared/constants.js package.json website/version.json website/template.html README.md website/sitemap.xml
git add extension/manifest.base.json shared/constants.js package.json website/version.json website/template.html README.md
git commit -m "chore(release): update versions to $GITHUB_REF_NAME [skip ci]" || echo "No changes to commit"
git push origin HEAD:main
env:
+16
View File
@@ -43,6 +43,22 @@ extension/shared/
# Auto-generated website build output
website/www/
website/.avif-cache.json
# Temporary scratch files
scratch/
# AI Assistants and Agents
.agents/
.antigravity/
.gemini/
.claude/
.codex/
.opencode/
.cursor/
.cursorrules
.copilot/
.cline/
.clinerules
.windsurfrules
.codeium/
+1 -1
View File
@@ -59,7 +59,7 @@ representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the project maintainer at **koaladev@koalamail.rocks**.
reported to the project maintainer at **koalasync@koalastuff.net**.
All complaints will be reviewed and investigated promptly and fairly.
All project maintainers are obligated to respect the privacy and security of the
+17 -11
View File
@@ -6,7 +6,7 @@
<p align="center">
<a href="https://github.com/Shik3i/KoalaSync/actions/workflows/release.yml"><img src="https://github.com/Shik3i/KoalaSync/actions/workflows/release.yml/badge.svg" alt="Release Status"></a>
<a href="https://github.com/Shik3i/KoalaSync/releases"><img src="https://img.shields.io/badge/Release-v2.5.2-blue?logo=github" alt="GitHub release"></a>
<a href="https://github.com/Shik3i/KoalaSync/releases"><img src="https://img.shields.io/badge/Release-v2.5.4-blue?logo=github" alt="GitHub release"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue" alt="License"></a>
<a href="https://addons.mozilla.org/de/firefox/addon/koalasync/"><img src="https://img.shields.io/badge/Firefox-Download-orange?logo=firefoxbrowser&logoColor=white" alt="Firefox Add-on"></a>
<a href="https://chromewebstore.google.com/detail/koalasync/obbnmkmlaaddodakcbdljknjpagklifc"><img src="https://img.shields.io/badge/Chrome-Download-blue?logo=googlechrome&logoColor=white" alt="Chrome Extension"></a>
@@ -14,7 +14,7 @@
<p align="center"><i>KoalaSync is a lightweight Browser Extension and Relay Server for synchronized video playback on almost any website with a video element—YouTube, Twitch, Netflix, Emby, Jellyfin, and beyond. Built with a focus on <b>Data Sovereignty</b> and <b>Performance</b>.</i></p>
<p align="center"><a href="docs/CHANGELOG.md"><b>New v2.5.2 Release!</b> — See what's changed</a></p>
<p align="center"><a href="docs/CHANGELOG.md"><b>New v2.5.4 Release!</b> — See what's changed</a></p>
### 🌟 Why KoalaSync?
@@ -29,6 +29,7 @@
- **Global Synchronization**: Synchronize Play, Pause, and Seeking on any website with a `<video>` tag.
- **Episode Auto-Sync**: Perfectly sync series binges. All peers wait until everyone has loaded the next episode before starting together.
- **Host Control & Co-Hosts**: Room hosts can lock playback control to trusted controllers while guests keep watching in sync.
- **Smart Matching**: Automatically highlights tabs containing matching video titles.
- **Dual Heartbeat Architecture**: Robust session tracking that prevents ghost rooms and stale connections.
- **Efficient Relay**: Minimal overhead WebSocket message forwarding.
@@ -58,7 +59,7 @@ The easiest and safest way to install KoalaSync is directly through the official
### 🌐 Localization & Translations
Both the official KoalaSync website and the **v2.0 Browser Extension** feature full dynamic localization:
Both the official KoalaSync website and the browser extension feature dynamic localization:
- **Available Languages**: Support is included for 15 languages: English (`en`), German (`de`), French (`fr`), Spanish (`es`), Portuguese (Brazil) (`pt-BR`), Russian (`ru`), Italian (`it`), Polish (`pl`), Turkish (`tr`), Dutch (`nl`), Japanese (`ja`), Korean (`ko`), Chinese (Simplified) (`zh`), Ukrainian (`uk`), and European Portuguese (`pt`).
- **Real-Time Extension Localization**: Inside the extension Settings panel, users can swap languages instantly. The entire interface, notifications, Empty States, and onboarding guides re-translate dynamically in real-time.
- **Contributing**: We welcome community translations for both the website and the extension! Please refer directly to the [TRANSLATION.md](docs/TRANSLATION.md) guide for step-by-step instructions on how to audit, refine, or add new languages.
@@ -86,16 +87,20 @@ npm run build:extension
The compiled artifacts will be available in the `dist/` directory.
#### For Self-Hosting (Docker)
Deploy your own private relay server using our official image:
For local development or a simple private relay, use the root Compose file:
```bash
# Pull the latest image
docker pull ghcr.io/shik3i/koalasync:latest
# Or use our example compose file
cp examples/docker-compose.caddy.example.yml docker-compose.yml
docker-compose up -d
cp server/.env.example server/.env
# Edit server/.env and set SERVER_SALT to a unique random value:
# openssl rand -base64 32
docker compose up -d --build
```
The server will be available at `ws://localhost:3000`. See [Docker network compose](examples/docker-compose.caddy.example.yml) or [Static IP compose](examples/docker-compose.ip.example.yml) for ready-to-use Docker Compose files.
The local relay will be available at `ws://localhost:3000`.
For production, use the official image and one of the ready-to-edit examples:
- [Docker network compose](examples/docker-compose.caddy.example.yml): for a Caddy or reverse-proxy network. This file does not publish `localhost:3000`; Caddy routes traffic to the container.
- [Static IP compose](examples/docker-compose.ip.example.yml): for a pre-existing Docker network with a fixed container IP.
In every real deployment, set a unique `SERVER_SALT`. Without it the relay still starts, but it warns that room-password hashes are using the public fallback salt from the repository.
To connect your extension to a self-hosted server, open the popup → **Room** tab → select **Custom Server** → enter your server's WebSocket URL (e.g., `ws://localhost:3000`).
@@ -134,6 +139,7 @@ gh attestation verify dist/koalasync-chrome.zip \
- **[PROTOCOL.md](docs/PROTOCOL.md)**: WebSocket protocol specification and event reference.
- **[ROADMAP.md](docs/ROADMAP.md)**: Planned features, backlog, and rejected ideas.
- **[SECURITY.md](SECURITY.md)**: Disclosure policy and security practices.
- **[AI_INIT.md](docs/AI_INIT.md)**: Maintainer and agent onboarding notes for safe code changes.
- **[Caddyfile.example](examples/Caddyfile.example)**: Production Caddy configuration for website and relay.
---
+1 -1
View File
@@ -44,7 +44,7 @@ The following components are within scope for security reports:
Instead, email the project maintainer privately:
**`koalasync_admin@koalamail.rocks`**
**`koalasync@koalastuff.net`**
Encrypt sensitive findings with our PGP key (available on request).
+2 -2
View File
@@ -16,7 +16,7 @@ Ready-to-paste copy for product listings, launch pages, directory submissions, a
## 2. Three-Sentence Overview
> KoalaSync is a lightweight browser extension that keeps you and your friends perfectly in sync on YouTube, Netflix, Twitch, Prime Video, Jellyfin, Emby, and almost any other site with an HTML5 video player — press play once and everyone stays together. It's built privacy-first: no accounts, no telemetry, and the official relay server runs entirely in volatile RAM with zero persistence, so nothing about your sessions is ever stored. Open source under the MIT license and fully self-hostable with a single Docker command, KoalaSync is a transparent watch-party tool that works everywhere and respects your data sovereignty.
> KoalaSync is a lightweight browser extension that keeps you and your friends perfectly in sync on YouTube, Netflix, Twitch, Prime Video, Jellyfin, Emby, and almost any other site with an HTML5 video player — press play once and everyone stays together. It's built privacy-first: no accounts, no telemetry, and the official relay server runs entirely in volatile RAM with zero persistence, so nothing about your sessions is ever stored. Open source under the MIT license and fully self-hostable with a single Docker Compose command, KoalaSync is a transparent watch-party tool that works everywhere and respects your data sovereignty.
---
@@ -38,7 +38,7 @@ Most watch-party tools fall into one of two traps: they only work on a short all
### Built for people who actually want to read the code
KoalaSync is MIT-licensed open source, built by a solo developer. Audit it, fork it, change it. The extension is dependency-free with a direct Socket.IO wire implementation — no opaque libraries, no framework bloat, no surprise third-party SDKs. Want full sovereignty? Self-host your own relay with a single Docker command and keep all watch-party coordination traffic inside your own infrastructure. The official public relay is there when you don't care, self-hosting is there when you do.
KoalaSync is MIT-licensed open source, built by a solo developer. Audit it, fork it, change it. The extension is dependency-free with a direct Socket.IO wire implementation — no opaque libraries, no framework bloat, no surprise third-party SDKs. Want full sovereignty? Set a unique `SERVER_SALT` in the supplied Compose file, then start your own relay with a single Docker Compose command and keep all watch-party coordination traffic inside your own infrastructure. The official public relay is there when you don't care, self-hosting is there when you do.
### Little touches you'll notice
+4 -4
View File
@@ -1,6 +1,6 @@
KoalaSync: Private Watch Parties for Emby, Jellyfin, Plex, Netflix & YouTube
Tired of counting down "3, 2, 1, Play" over voice chat? KoalaSync keeps you and your friends perfectly in sync. Whether you are streaming from your own self-hosted media server like Emby, Jellyfin or Plex, or watching on a major platform like Netflix, Prime Video or YouTube KoalaSync is designed for smooth, browser-based watch parties.
Tired of counting down "3, 2, 1, Play" over voice chat? KoalaSync keeps you and your friends perfectly in sync. Whether you are streaming from your own self-hosted media server like Emby, Jellyfin or Plex, or watching on a major platform like Netflix, Prime Video or YouTube, KoalaSync is designed for smooth, browser-based watch parties.
✨ CORE FEATURES
@@ -12,7 +12,7 @@ No account required. No tracking. Just create a room, invite your friends, and s
• Smart Binge-Watching: When a new episode loads, KoalaSync automatically pauses the lobby until everyone is ready. No spoilers, no one left behind.
• Smart Audio Compressor: Tired of quiet dialogue and suddenly loud action scenes? Balance whispering, explosions, and music with a single click while you watch.
• One-Click Invites: Send a smart invite link to your friends. When they open it, KoalaSync automatically configures the room so they can join instantly.
• 13 Languages: Enjoy a native experience with a fully translated user interface.
• 15 Languages: Enjoy a native experience in English, German, French, Spanish, Brazilian and European Portuguese, Russian, Italian, Polish, Turkish, Dutch, Japanese, Korean, Simplified Chinese, and Ukrainian.
@@ -33,14 +33,14 @@ KoalaSync is built for private watch parties without unnecessary data collection
3. Share the invite link with your friends.
4. Open your favorite streaming site or media server.
5. Select the active video tab.
6. Press play — everyone stays perfectly in sync.
6. Press play. Everyone stays perfectly in sync.
⚙️ UNDER THE HOOD
KoalaSync is lightweight, transparent, and built with privacy in mind.
• On-Demand Relay: Playback state is synchronized through a custom WebSocket-based relay server. No persistent connection — the relay is only active while you're in a room. No background traffic, no idle connections.
• On-Demand Relay: Playback state is synchronized through a custom WebSocket-based relay server. There is no permanent background connection. The relay connection is maintained only while you're in a room and closes when you leave or automatically after two hours without a selected-video heartbeat.
• No Media Streaming: KoalaSync does not stream, proxy, upload, download, or redistribute any video content. Everyone watches from their own browser on the original website.
• Temporary Room State Only: The relay server only coordinates room state such as play, pause, seek position, active target, nickname, and readiness status.
• Docker Self-Hosting: The relay server can be self-hosted with Docker if you prefer to run your own private instance.
+29 -27
View File
@@ -7,7 +7,7 @@ Welcome to the KoalaSync project. This file is the primary entry point for any d
> - **Font Stack**: Use a modern system font stack (e.g., -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif) to maintain a premium look without external dependencies. Prohibit the use of `@import` or `<link>` for external font services.
>
> [!IMPORTANT]
> **Caveman Communication Protocol**: To conserve context window and tokens, AI agents MUST communicate with the user in **caveman language** (broken, short German/English hybrid caveman style, e.g., "Ich Antigravity. Ich machen Git pull. Code fertig.") at all times. This rule is highly strict and must NOT be broken under any circumstances unless the user explicitly requests to drop it.
> **Communication Standard**: Be concise, concrete, and professional. Match the user's language when practical, explain risky changes before making them, and report exactly what was changed and verified. Do not use joke protocols or intentionally broken language in contributor-facing work.
---
@@ -21,28 +21,30 @@ KoalaSync is a specialized tool for **synchronized video playback** across multi
- `extension/`: Browser Extension (Chrome & Firefox, Manifest V3). Contains background service worker, content scripts, and popup UI.
- `server/`: Node.js Relay Server using Socket.IO (WebSocket-only).
- `website/`: **Landing Page** & Invitation Bridge (Marketing, Tutorials, and Downloads).
- **`build.cjs`**: Zero-dependency static site compiler. Translates `template.html` + `locales/*.json``www/`. Also minifies CSS/JS automatically.
- **`www/` is auto-generated**: Never edit files in `www/` directly. Always edit source files (`template.html`, `style.css`, `app.js`, `lang-init.js`, `locales/*.json`) and run `node website/build.cjs` to regenerate. CSS/JS are output as `.min.*` files — a built-in cleanup step removes stale artifacts on each build.
- `shared/`: **Single Source of Truth** for protocol constants and event names.
- **`build.cjs`**: Static site compiler using the repository's build dependencies. Translates `template.html` + `locales/*.json``www/`, generates the sitemap, and minifies HTML/CSS/JS.
- **`www/` is auto-generated**: Never edit files in `www/` directly. Always edit source files (`template.html`, `style.css`, `styles/*.css`, `app.js`, `lang-init.js`, `locales/*.json`) and run `node website/build.cjs` to regenerate. `style.css` is the development manifest; `style.legacy.css` is an unloaded, byte-identical migration reference. Production creates page-specific and render-priority CSS bundles from `styles/*.css`; CSS/JS are output as `.min.*` files and stale generated assets are removed on each build.
- `shared/`: **Single Source of Truth** for protocol constants, event names, blacklist data, and generated usernames.
- `scripts/`: Development utilities (e.g., `build-extension.cjs`).
- `docker-compose.yml`: Root-level orchestration for the relay server.
> [!IMPORTANT]
> **Single Source of Truth**: `shared/constants.js` and `shared/blacklist.js` are the master files. They must be synchronized to the `extension/shared/` directory using `node scripts/build-extension.cjs`.
> **Single Source of Truth**: `shared/constants.js`, `shared/blacklist.js`, and `shared/names.js` are the master shared files. They must be synchronized to the `extension/shared/` directory using `node scripts/build-extension.cjs`.
> - **Extension Modules** (`background.js`, `popup.js`) import directly from `./shared/constants.js`.
> - **Content Scripts** (`content.js`) use a **marker-injected synchronous copy** of the constants. The build script automatically replaces the marked blocks — no manual mirroring needed.
## 3. Mandatory Reading
Before touching any code, you MUST read the following documents in order:
1. [ARCHITECTURE.md](ARCHITECTURE.md) Detailed communication flows, Dual Heartbeat, and two-phase sync protocol.
2. [extension/README.md](../extension/README.md) Extension components, tab structure, and loading process.
3. [SYNC_GUIDE.md](SYNC_GUIDE.md) Protocol constants and synchronization requirements.
1. [../README.md](../README.md) User, developer, and self-hosting overview.
2. [README.md](README.md) Documentation map by role.
3. [ARCHITECTURE.md](ARCHITECTURE.md) Detailed communication flows, Dual Heartbeat, and two-phase sync protocol.
4. [../extension/README.md](../extension/README.md) Extension components, tab structure, and loading process.
5. [SYNC_GUIDE.md](SYNC_GUIDE.md) Protocol constants and synchronization requirements.
## 4. The "Vanilla JS Mirror" Pattern
To avoid boot-time race conditions in Manifest V3 without a bundler, the following architectural trade-off is enforced:
- **Synchronous Execution**: `content.js` MUST execute synchronously to catch early media events.
- **Automated Injection**: The build script (`node scripts/build-extension.cjs`) automatically injects `EVENTS` and `HEARTBEAT_INTERVAL` into `content.js` using marker-based replacement (see `../scripts/README.md` for marker details).
- **Maintenance**: After modifying `shared/constants.js`, simply run the build script. No manual mirroring is required.
- **Automated Injection**: The build script (`node scripts/build-extension.cjs`) automatically injects `EVENTS`, `HEARTBEAT_INTERVAL`, and episode utility functions into `content.js` using marker-based replacement (see `../scripts/README.md` for marker details).
- **Maintenance**: After modifying any root `shared/` file, run the build script. No manual mirroring is required.
## 5. File Responsibility Map
@@ -52,26 +54,24 @@ To avoid boot-time race conditions in Manifest V3 without a bundler, the followi
| `content.js` | Video element detection, media control, event origin detection (loop prevention) |
| `popup.js` | UI rendering, user input handling, peer display, invitation link generation |
| `bridge.js` | Landing page ↔ extension communication for invitation join flow |
| `episode-utils.js` | Shared episode parsing, imported by background and injected into content |
| `title-privacy.js` | Tab/media title privacy normalization and sanitization |
| `page-api-seek-overrides.js` | Page-level seek bridge for site-specific player APIs |
| `server/index.js` | Room management, message relay, rate limiting, authentication, peer lifecycle |
## 6. Design Guidelines
The popup UI follows a strict design system. Do not modify these variables or the layout structure without explicit approval.
- **Font**: System font stack. **MANDATORY**: No external CDNs or Google Fonts to ensure 100% privacy.
- **Popup Width**: Fixed at `320px`.
- **Tab Structure**: Must maintain the **Room**, **Sync**, **Settings**, and **Dev** tabs.
- **CSS Variables**:
| Variable | Value | Purpose |
| :--- | :--- | :--- |
| `--bg` | `#0f172a` | Main background |
| `--card` | `#1e293b` | Form and info cards |
| `--accent` | `#6366f1` | Primary actions and branding |
| `--success` | `#22c55e` | Success states / Online dot |
| `--error` | `#ef4444` | Errors / Offline dot |
- **Tab Structure**: Must maintain the visible **Room**, **Sync**, **Settings**, and **Status** tabs. The hidden **Dev** tab is available only for developer diagnostics.
- **Appearance modes**: Preserve `system`, `light`, and `dark` behavior and the Eucalyptus, Cyber, and Graphite palettes.
- **CSS variables**: Use the semantic tokens defined in `popup.html` (`--bg`, `--card`, `--accent`, `--text`, `--text-muted`, `--success`, `--warning`, and `--error`). Do not hard-code the retired indigo/slate palette or bypass palette-specific token overrides.
## 7. Non-Negotiables (Core Logic)
The following features are critical and must not be removed or fundamentally altered:
- **Two-Phase Force Sync**: The `Prepare``ACK``Execute` flow ensures all peers are buffered before playback resumes.
- **Episode Auto-Sync**: Ensures series binges stay perfectly synced. A lobby initiates during title transitions, freezing peers until everyone is ready.
- **Host Control Mode**: In `host-only` rooms, only the host and promoted controllers may initiate room-moving playback events. Both client-side UX and server-side gates must remain intact.
- **Dual Heartbeat**:
- **Background Heartbeat (1m)**: Ensures session persistence even without a video element.
- **Content Heartbeat (15s)**: Transmits current video metadata (time, title).
@@ -80,8 +80,9 @@ The following features are critical and must not be removed or fundamentally alt
- **Platform Specifics**: Specialized click-logic for YouTube (`.ytp-play-button`) and Twitch.
- **pollSeekReady()**: Polling mechanism that checks `video.readyState` before acknowledging sync.
- **SW Keep-alive**: Use of `chrome.alarms` to prevent the Manifest V3 Service Worker from suspending.
- **Diagnostics**: The "Dev" tab provides real-time access to the underlying `<video>` state for troubleshooting.
- **Diagnostics**: The visible **Status** tab provides real-time access to connection state, ping, logs, history, and underlying `<video>` state for troubleshooting.
- **Persistence**: `peerId` and `username` must be stored to remain stable across sessions.
- **Title Privacy**: Do not accidentally reintroduce tab/media title sharing when users disabled or reduced it.
- **Room ID Format**: Room IDs are restricted to `[a-zA-Z0-9-]` only (alphanumeric + hyphens). This is enforced server-side.
## 8. Technical Constraints
@@ -89,7 +90,8 @@ The following features are critical and must not be removed or fundamentally alt
- **Manual Protocol**: `background.js` implements a subset of the Socket.IO wire protocol natively.
- **Server Transport**: Restricted to `websocket` only. Polling is disabled.
- **Docker Context**: The Docker build must run from the **Repo Root**.
- **Manifest Settings**: `run_at` must remain `document_idle`, and `all_frames` must remain `false`.
- **Content Script Scope**: `bridge.js` is the only static content script in the manifest and runs on `https://sync.koalastuff.net/*` at `document_start`. Video control scripts are injected only into the selected tab via `chrome.scripting`; do not add broad persistent video content-script matches.
- **Self-Hosting Salt**: Production/self-hosted relay examples must include a unique `SERVER_SALT` so room-password hashes are not derived with the public fallback salt.
- **Strict Backward & Forward Compatibility (Store Delay Rule)**: Browser extensions are distributed through stores (e.g., Chrome Web Store, Firefox Add-ons) which can take up to 2 weeks to approve updates. Therefore, the server MUST NOT reject older extension clients unless a critical protocol version bump is explicitly authorized, and new extension versions MUST remain fully operational when connected to older servers (e.g., by silently falling back if a new feature is not supported). This is a core architectural requirement.
## 9. Security & Deployment
@@ -117,7 +119,7 @@ Before starting any task, committing, or pushing, you **MUST** run `git pull --r
> **AI AGENTS MUST FOLLOW THIS EXACT SEQUENCE WHEN RELEASING A NEW VERSION OR TAGGING.**
>
> **🚫 NO MANUAL VERSION BUMPING**: You MUST **NEVER** manually modify the version strings in `package.json`, `extension/manifest.base.json`, or `website/version.json`. The GitHub Actions CI pipeline automatically extracts the version from the git tag (e.g. `v2.0.5` -> `2.0.5`), injects it into all target files, and commits the updates back to `main` with `[skip ci]`. Manual bumps will cause merge conflicts and build failures.
> - **Website Versioning**: **NEVER** manually modify the version fallback strings in `website/index.html`. The website dynamically fetches the latest version and release date from `website/version.json` at runtime using `website/app.js`. Manual bumps in the HTML file are completely redundant and should be avoided.
> - **Website Versioning**: **NEVER** manually modify generated version strings in `website/www/`. The website build injects version data from `website/version.json` into generated output.
1. **MANDATORY SYNTAX & LINT CHECKS**: Before staging, committing, or pushing any changes, you **MUST** run both checks on every modified JavaScript file:
- **Syntax Validation**: Run `node -c` on every single modified JavaScript file (e.g., `node -c extension/background.js` and `node -c extension/content.js`). **NEVER** commit or push code that fails this check.
- **ESLint Validation**: Run `npm run lint` (or `npx eslint .`). The output must show **zero errors and zero warnings**. ESLint is configured to catch undefined variables, unused vars, unreachable code, and other semantic issues. **NEVER** commit or push code that fails this check.
@@ -141,18 +143,18 @@ Before starting any task, committing, or pushing, you **MUST** run `git pull --r
3. Implement the handler in `server/index.js` and `background.js`.
### Making Website Changes
1. Edit source files in `website/` (`template.html`, `style.css`, `app.js`, `lang-init.js`, or `locales/*.json`).
1. Edit source files in `website/` (`template.html`, `style.css`, `styles/*.css`, `app.js`, `lang-init.js`, or `locales/*.json`).
2. Run the compiler: `node website/build.cjs`. This generates the multilingual pages in `www/` and minifies CSS/JS.
3. Verify the output: `node --check website/www/app.js && node --check website/www/lang-init.js`.
3. Verify the sources and generated contract: `node --check website/app.js`, `node --check website/lang-init.js`, `node scripts/test-website-locales.mjs`, and `node scripts/test-website-theme.mjs`.
4. Test locally: `npx serve website/www` or `python3 -m http.server 8080 -d website/www`.
5. Commit both source changes and the updated `www/` output.
5. Commit the source changes only. `website/www/` is generated and gitignored.
### Testing Locally
1. Run the build script: `node scripts/build-extension.cjs`.
2. Load `dist/chrome/` as an "Unpacked Extension" in Chrome (or `dist/firefox/` in Firefox).
3. Start the server from the root: `docker-compose up --build`.
3. Start the server from the root: `docker compose up --build`.
4. Use **different browser profiles** or vendors to test multi-peer logic.
5. Use the **Dev tab** to verify real-time video element metadata.
5. Use the **Status tab** to verify real-time connection state, logs, and video element metadata.
### Locking Old Versions
1. Update `MIN_VERSION` in the server's `.env` file to the minimum acceptable version.
+32 -9
View File
@@ -1,23 +1,46 @@
# KoalaSync Changelog
All notable changes to the KoalaSync browser extension and relay server.
All notable changes to the KoalaSync browser extension, relay server, website, and release tooling.
---
## Unreleased
## [v2.6.0] — 2026-07-15
### Added
- **Website: Expanded comparison guides** — Added fully localized comparison pages for Kosmi, Scener, and TwoSeven, plus improved existing alternatives pages and navigation.
- **Website: AI-readable product profile** — Expanded `llms.txt` with fit guidance, limitations, architecture, privacy, installation, self-hosting, and support information, and linked it from every localized landing-page head.
- **Website: Accessibility regression coverage** — Added automated checks for light-theme step numbers, legal-link cues, heading hierarchy, readable self-hosting surfaces, and reduced-motion behavior.
- **Extension: Appearance controls** — Added localized system, light, and dark theme options with an early theme initializer to avoid flashes during popup startup.
### Changed
- **Website: Koala nature redesign** — Rebuilt the landing page around a responsive day/night forest theme with richer motion, an improved interactive demo, clearer onboarding, polished legal/join/error pages, and stronger mobile behavior.
- **Extension: Popup and settings redesign** — Unified controls, status surfaces, colors, icons, badges, and accessibility behavior; settings are now organized into mutually exclusive accordion groups.
- **Website: Faster rendering and builds** — Split page CSS by responsibility, removed startup forced reflows, added responsive mascot assets, cached AVIF generation, subset the flag font, minified generated HTML, and added integrity metadata for scripts and styles.
- **Website: SEO and localization** — Added richer structured metadata, AI-crawler guidance, dynamic sitemap generation, and complete translations for the expanded alternatives content.
- **Website: Safer self-hosting example** — Added an explicit `SERVER_SALT` replacement value, optional admin-metrics configuration, loopback-only relay publishing, and consistent host-Caddy proxy targets without requiring a separate `.env` file.
### Fixed
- **Extension: Episode Lobby reliability** — Prevented the lobby from remaining stuck in a loading state and stopped episode transitions from triggering on non-episodic media.
- **Extension: Tab-title normalization** — Notification counters such as `(14)`, `[7]`, and `(99+)` are removed reliably without stripping legitimate large numeric titles.
- **Website and extension: Theme contrast and navigation** — Fixed light-theme contrast, language highlighting, mobile join navigation, and several control-label and tooltip inconsistencies.
- **Website: Build and accessibility correctness** — Replaced the regex HTML minifier with conservative parser-based `htmlnano`, stopped tracking generated sitemap output, restored readable light-theme step numbers, fixed legal-page and comparison-card contrast, repaired heading order, and disabled all film motion when reduced motion is requested.
---
## [v2.5.4] — 2026-07-08
### Changed
- **Extension: Refined clutter blacklist** — Removed `localhost` and cloud storage providers (`drive.google.com`, `dropbox.com`, `onedrive.live.com`, `icloud.com`) from the domains blacklist so that local web development servers and tabs hosting video files in cloud storage are no longer hidden under "Hide Clutter Tabs".
---
## [v2.5.3] — 2026-07-02
### Fixed
- **Extension: Disney+ force sync and seek reliability** — The v2.5.2 Disney+ page-API integration leaked blob-relative `<video>` time into force sync, seeks, and heartbeats when the page-API bridge had no fresh data, which presented as "force sync does nothing on Disney+". Time/duration accessors now refuse to return native values on Disney+ (returning null/0) so stale bridge data degrades to a clean no-op instead of broadcasting garbage. `FORCE_SYNC_PREPARE` and `SEEK` payloads are now validated as finite before being relayed, and the popup's force-sync flow fails cleanly with a clear error rather than sending NaN through.
- **Extension: Force-sync no longer routed twice** — A popup-initiated `FORCE_SYNC_PREPARE` was being delivered to the content script twice (once by the generic popup route and once by the force-sync-specific route), causing a double seek. The generic route is now scoped to play/pause/seek only.
- **Extension: Disney+ Host Control Mode classification** — `hcmIsLive` previously read the native `<video>` duration to detect live streams, which on Disney+ is blob-relative garbage and falsely classified every stream as live (disabling snap-back and the desync dialog). The native-duration live signal is now skipped on Disney+ while YouTube/Twitch live detection via `Infinity` duration is preserved.
- **Extension: Disney+ episode auto-sync and lobby readiness** — Episode-transition detection and the episode-lobby "ready" poll now read the playhead through the gated time accessor, so they no longer rely on blob-relative `currentTime` on Disney+.
- **Extension: Force-sync median no longer skewed by peers without a known time** — A peer broadcasting `currentTime: null` (e.g. a Disney+ peer whose page-API bridge was not yet ready, or a freshly joined peer) was coerced to `0` by the jump-to-others median calculation, dragging the sync target toward the start of the video. Null and empty peer times are now excluded before the median.
- **Extension: Force-sync `jump-to-me` retry on Disney+** — When the content script responds but the page-API bridge has not yet delivered a finite time (typical during the first ~250 ms after a Disney+ player loads), the popup now retries once without redundantly re-injecting the content script.
- **Extension: Empty-string seek payload rejection** — The internal seek-time coercion no longer treats `''` as `0`; an empty-string `targetTime`/`currentTime` is rejected as invalid.
- **Extension: Disney+ force sync and seeking** — Fixed force sync on Disney+ failing or jumping to wrong positions. The extension now relies solely on accurate player-API time and fails cleanly when it isn't available yet, instead of falling back to unreliable raw video data.
- **Extension: Force-sync accuracy** — When syncing to the group, peers whose current position isn't known yet (e.g. a Disney+ peer that just loaded) no longer pull the sync target toward the start of the video.
- **Extension: Disney+ Host Control Mode** — Regular Disney+ content is no longer misclassified as a live stream, which had silently disabled the desync dialog and snap-back for guests in host-controlled rooms. YouTube and Twitch live detection is unchanged.
- **Extension: Disney+ episode auto-sync** — Episode transitions and the "waiting for peers" lobby flow now work reliably on Disney+ again.
---
+3 -2
View File
@@ -18,8 +18,9 @@ KoalaSync is a **privacy-preserving watch-party sync tool**, not a security prod
- **Rooms are ephemeral.** They exist for a few hours and are auto-reaped. There are no
accounts, no persistent storage, no money, and no sensitive content on the relay.
- **The relay is a dumb, stateless message bus.** It forwards play/pause/seek between
peers who *chose* to watch together and joined via an invite link shared out-of-band.
- **The relay is a zero-persistence, in-memory message bus.** It temporarily holds room
and peer state while forwarding play/pause/seek between peers who *chose* to watch
together and joined via an invite link shared out-of-band.
- **Participants are invited.** Anyone in a room was let in. The social contract is
"we're watching a video together," not "mutually distrusting parties."
+37 -5
View File
@@ -1,8 +1,40 @@
# Technical Documentation
This directory contains deep-dives into the KoalaSync protocol and architecture.
This directory contains deep-dives into the KoalaSync protocol, architecture, roadmap, and operational guidelines.
- [HOW_IT_WORKS.md](HOW_IT_WORKS.md): Step-by-step walkthrough of every user flow, from room creation to synchronized playback. Ideal for store reviewers and manual testers.
- [ARCHITECTURE.md](ARCHITECTURE.md): Communication flows, Dual Heartbeat, and Sync logic.
- [SYNC_GUIDE.md](SYNC_GUIDE.md): Protocol constants and sync requirements.
- [TRANSLATION.md](TRANSLATION.md): Translation and localization guide for the extension and website.
## Start Here by Role
- **Users and reviewers**: Start with [HOW_IT_WORKS.md](HOW_IT_WORKS.md), then [PRIVACY.md](PRIVACY.md) and [TESTED_SERVICES.md](TESTED_SERVICES.md).
- **Self-hosters**: Start with the root [README.md](../README.md), then [devops.md](devops.md), [PROTOCOL.md](PROTOCOL.md), and the examples in `../examples/`.
- **Contributors**: Start with [../CONTRIBUTING.md](../CONTRIBUTING.md), then [ARCHITECTURE.md](ARCHITECTURE.md), [SYNC_GUIDE.md](SYNC_GUIDE.md), and the README for the subdirectory you are editing.
- **AI agents**: Start with [AI_INIT.md](AI_INIT.md), then read the relevant subdirectory README before changing files.
- **Security reviewers**: Start with [SECURITY.md](../SECURITY.md), [KNOWN_LIMITATIONS.md](KNOWN_LIMITATIONS.md), [PRIVACY.md](PRIVACY.md), and [PROTOCOL.md](PROTOCOL.md).
## 🏗️ Core Architecture & Design
- **[ARCHITECTURE.md](ARCHITECTURE.md)**: Overview of the communication flows, Dual Heartbeat architecture, and synchronization logic.
- **[HOW_IT_WORKS.md](HOW_IT_WORKS.md)**: Step-by-step walkthrough of every user flow, from room creation to synchronized playback. Ideal for store reviewers and manual testers.
- **[host-control-mode.md](host-control-mode.md)**: Design, requirements, and edge cases of the Host Control feature.
- **[AI_INIT.md](AI_INIT.md)**: Maintainer and AI-agent onboarding: non-negotiables, workflow order, and safety checks.
## 📡 Protocol & Synchronization
- **[PROTOCOL.md](PROTOCOL.md)**: Low-level message format and payload descriptions for the KoalaSync sync protocol.
- **[SYNC_GUIDE.md](SYNC_GUIDE.md)**: Guide on keeping protocol constants synchronized across the workspace.
## 📋 Compatibility, Roadmap & Contribution
- **[TESTED_SERVICES.md](TESTED_SERVICES.md)**: Status of compatibility with major streaming services and contribution guidelines for testing new platforms.
- **[KNOWN_LIMITATIONS.md](KNOWN_LIMITATIONS.md)**: Threat model and accepted design limitations (NOFIX entries) for security audits.
- **[PRIVACY.md](PRIVACY.md)**: Privacy model and data-handling policy for users, reviewers, and contributors.
- **[ROADMAP.md](ROADMAP.md)**: Planned features, backlog items, and rejected proposals.
- **[TRANSLATION.md](TRANSLATION.md)**: Guide for native speakers to contribute and audit dynamic extension/website translations.
## 🚀 DevOps & Releases
- **[devops.md](devops.md)**: Guide on the automated tag-based release pipeline.
- **[CHANGELOG.md](CHANGELOG.md)**: Detailed history of releases and changes.
---
*For high-level project information and developer setup instructions, refer to the root [README.md](../README.md).*
+7 -5
View File
@@ -10,8 +10,9 @@ You MUST run the build script in any of the following scenarios:
1. **After a fresh `git clone` or `git pull`** (as the synced files are ignored by git).
2. **After modifying** `shared/constants.js`.
3. **After modifying** `shared/blacklist.js`.
4. **Before committing** changes to the repository if any protocol-related files were touched.
5. **Before deploying** the server or releasing the extension.
4. **After modifying** `shared/names.js`.
5. **Before committing** changes to the repository if any shared protocol or extension-mirrored files were touched.
6. **Before deploying** the server or releasing the extension.
## How to sync
@@ -24,10 +25,11 @@ npm run build:extension
## What does it do?
The build script performs the following actions:
1. Synchronizes protocol constants by copying `shared/constants.js`, `shared/blacklist.js`, and `shared/README.md` into `extension/shared/`.
1. Synchronizes shared files by copying `shared/constants.js`, `shared/blacklist.js`, `shared/names.js`, and `shared/README.md` into `extension/shared/`.
2. Injects `EVENTS`, `HEARTBEAT_INTERVAL`, and `episode-utils.js` functions (`extractEpisodeId`, `sameEpisode`) into `content.js` via marker-based replacement.
3. Compiles browser-specific manifest files.
4. Packages the final ready-to-publish extension artifacts for Chrome and Firefox into the `dist/` directory.
3. Injects browser-specific uninstall URL constants into `background.js` and a build timestamp into `popup.html`.
4. Compiles browser-specific manifest files.
5. Packages the final ready-to-publish extension artifacts for Chrome and Firefox into the `dist/` directory.
## Protocol Versioning
The system enforces a strict `protocolVersion` check during the `JOIN_ROOM` handshake.
+44 -24
View File
@@ -1,38 +1,58 @@
# Tested Streaming Services
# 🎬 Tested Streaming Services & Compatibility
This document tracks which streaming platforms and media servers have been tested with KoalaSync.
This document tracks which streaming platforms and media servers are supported by the KoalaSync extension.
| Service | Sync Works | Media Title | Episode Auto-Sync | Notes |
|---------|:----------:|:-----------:|:-----------------:|-------|
| **YouTube** | ✅ Full | ✅ Full | ❌ | Individual videos, not episodes — no episode auto-sync. |
| **Twitch** | ✅ Full | ✅ Full | ❌ | Individual streams/VODs, not episodes — no episode auto-sync. |
| **Netflix** | ✅ Full | ❌ | ❌ | No media title exposed. |
| **Emby** | ✅ Full | ✅ Full | ✅ Full | Best-in-class support. |
| **Jellyfin** | ✅ Full | ✅ Full | ✅ Full | — |
| **Plex** | Not tested | Not tested | Not tested | — |
| **Disney+** | ✅ Full | ⚠️ Partial | ❌ | Series title only (e.g. "The Simpsons"), no episode info. |
| **Prime Video** | ✅ Full | ✅ Full | ❌ | — |
| **HBO Max / Max** | Not tested | Not tested | Not tested | — |
| **Crunchyroll** | Not tested | Not tested | Not tested | — |
| **Vimeo** | Not tested | Not tested | Not tested | — |
| **Dailymotion** | Not tested | Not tested | Not tested | — |
| **ARD / ZDF Mediathek** | Not tested | Not tested | Not tested | — |
> [!TIP]
> **Contributions are highly welcome!** 🤝 Anyone can easily update this list. If you have tested a streaming service (whether it works, has issues, or is not yet listed), please help the project by submitting a quick Pull Request. See the [How to Contribute](#how-to-contribute) guide below!
## Legend
---
## Compatibility Matrix
| Service | Sync Works | Media Title | Episode Auto-Sync | Last Tested | Tested By | Extension Version | Notes |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :--- |
| **YouTube** | ✅ Full | ✅ Full | ❌ N/A | — | — | — | Individual videos, not episodes. |
| **Twitch** | ✅ Full | ✅ Full | ❌ N/A | — | — | — | Individual streams/VODs. |
| **Netflix** | ✅ Full | ❌ | ❌ | — | — | — | No media title exposed. |
| **Emby** | ✅ Full | ✅ Full | ✅ Full | — | — | — | Best-in-class support. |
| **Jellyfin** | ✅ Full | ✅ Full | ✅ Full | — | — | — | — |
| **Plex** | Not tested | Not tested | Not tested | — | — | — | — |
| **Disney+** | ✅ Full | ⚠️ Partial | ❌ | — | — | — | Series title only (e.g. "The Simpsons"), no episode info. |
| **Prime Video** | ✅ Full | ✅ Full | ❌ | — | — | — | — |
| **HBO Max / Max** | Not tested | Not tested | Not tested | — | — | — | — |
| **Crunchyroll** | Not tested | Not tested | Not tested | — | — | — | — |
| **Vimeo** | Not tested | Not tested | Not tested | — | — | — | — |
| **Dailymotion** | Not tested | Not tested | Not tested | — | — | — | — |
| **ARD / ZDF Mediathek** | Not tested | Not tested | Not tested | — | — | — | — |
| **Vix** | ✅ Full | ✅ Full | ✅ Full | — | — | — | Everything works correctly. |
### Legend
| Symbol | Meaning |
|--------|---------|
| :---: | :--- |
| ✅ Full | Works without limitations. |
| ⚠️ Partial | Works with caveats (see Notes). |
| ❌ N/A | Not applicable or not supported. |
| ❌ | Not supported / does not work. |
| ❌ N/A | Not applicable (feature does not exist on the platform). |
| **Not tested** | Has not been tested yet. |
---
## How to Contribute
Tested a service that's not listed? Found different behavior than documented?
Updating this compatibility list is quick and easy! You don't need deep coding skills to contribute:
1. Test KoalaSync on the service with two browser profiles
2. Use the extension's **Dev tab** to check `readyState`, `currentTime`, and media title
3. Open a GitHub issue or PR updating this table
1. **Fork the Repository**: Click the **Fork** button at the top of the [KoalaSync GitHub Repository](https://github.com/Shik3i/KoalaSync).
2. **Edit this File**: Open [docs/TESTED_SERVICES.md](TESTED_SERVICES.md) in your fork's browser editor (or clone it locally) and update the table with your testing details.
3. **Commit & Push**: Commit your changes with a clear message (e.g., `docs: update Netflix compatibility status`).
4. **Create a Pull Request**: Submit the Pull Request (PR) from your fork to our `main` branch.
> [!NOTE]
> **Reporting Problems:** If you notice a bug or partial support on a service, please open a [GitHub Issue](https://github.com/Shik3i/KoalaSync/issues) describing the problem, and link it in the **Notes** column of the table.
>
> _If you are unsure how to create/link an issue, don't worry! Simply submit the PR anyway, and the maintainers will gladly create and link the issue for you._
---
## Technical Background
+4 -2
View File
@@ -1,6 +1,6 @@
export default [
{
ignores: ["coverage/**", "dist/**", "node_modules/**", "scratch/**"]
ignores: ["coverage/**", "dist/**", "node_modules/**", "scratch/**", "website/www/**"]
},
{
languageOptions: {
@@ -18,6 +18,8 @@ export default [
setInterval: "readonly",
clearTimeout: "readonly",
clearInterval: "readonly",
requestAnimationFrame: "readonly",
cancelAnimationFrame: "readonly",
fetch: "readonly",
CustomEvent: "readonly",
MutationObserver: "readonly",
@@ -58,7 +60,7 @@ export default [
}
},
{
files: ["server/**/*.js", "scripts/**/*.js", "scripts/**/*.cjs", "website/build.cjs"],
files: ["server/**/*.js", "scripts/**/*.js", "scripts/**/*.cjs", "website/build.cjs", "website/**/*.cjs"],
languageOptions: {
globals: {
require: "readonly",
+16
View File
@@ -18,6 +18,14 @@
# # Clean URLs support (resolves /join to join.html, etc.)
# try_files {path} {path}.html {path}/
# file_server
#
# # Serve the themed 404 page for unknown URLs (without this block,
# # Caddy returns an empty 404 response)
# handle_errors {
# @notfound expression {err.status_code} == 404
# rewrite @notfound /404.html
# file_server
# }
# }
#
# syncserver.koalastuff.net {
@@ -57,6 +65,14 @@ sync.koalastuff.net {
try_files {path} {path}.html {path}/
file_server
# Serve the themed 404 page for unknown URLs (without this block,
# Caddy returns an empty 404 response)
handle_errors {
@notfound expression {err.status_code} == 404
rewrite @notfound /404.html
file_server
}
# Static Caching for high-performance PageSpeed (1 year with validation)
@static {
file
@@ -9,6 +9,7 @@ services:
- MIN_VERSION=1.0.0 # Minimum client version allowed to connect
- MAX_ROOMS=100 # Maximum number of rooms that can exist
- MAX_PEERS_PER_ROOM=25 # Maximum number of peers allowed per room
- SERVER_SALT=CHANGE_ME_GENERATE_WITH_OPENSSL_RAND_BASE64_32 # Required: unique random salt for room-password hashes
- ADMIN_METRICS_TOKEN= # Optional: 32+ char random token for aggregate-only /health metrics
pids_limit: 2048 # Limits the container to 2048 process IDs for safety
networks: # Attaches the service to the networks listed below
+1
View File
@@ -11,6 +11,7 @@ services:
- MIN_VERSION=1.0.0 # Minimum client version allowed to connect
- MAX_ROOMS=100 # Maximum number of rooms that can exist
- MAX_PEERS_PER_ROOM=25 # Maximum number of peers allowed per room
- SERVER_SALT=CHANGE_ME_GENERATE_WITH_OPENSSL_RAND_BASE64_32 # Required: unique random salt for room-password hashes
- ADMIN_METRICS_TOKEN= # Optional: 32+ char random token for aggregate-only /health metrics
pids_limit: 2048 # Limits the container to 2048 process IDs for safety
networks: # Attaches the service to the networks listed below
+86 -32
View File
@@ -1,52 +1,106 @@
# KoalaSync Browser Extension
A Manifest V3 Browser Extension (Chrome & Firefox) for synchronized video playback across any website.
This directory contains the Manifest V3 browser extension for Chrome and Firefox. It owns the popup UI, background service worker, content-script video control, invitation bridge, audio processing, and all browser-local settings.
## Where You Are
- `manifest.base.json` is the source manifest. The build script creates browser-specific `manifest.json` files in `dist/chrome/` and `dist/firefox/`.
- `background.js` is the long-lived coordinator: WebSocket client, room state, host-control authority, heartbeat, reconnects, tab selection, and content-script injection.
- `content.js` runs in the selected video tab. It detects video state, applies remote play/pause/seek, handles episode transitions, and applies local audio processing.
- `popup.html` and `popup.js` implement the visible extension UI.
- `extension/shared/` is generated by `npm run build:extension` from the root `shared/` directory. Do not edit it directly.
## Key Features
- **Manifest V3**: Optimized Service Worker architecture with session persistence.
- **Pure Vanilla JS**: No external dependencies or heavy libraries.
- **Smart Peer IDs**: Hexadecimal IDs combined with customizable Usernames for easy identification.
- **On-Demand Connection**: The service worker only maintains a WebSocket connection while you're in a room. No persistent background connections — privacy-first architecture. Based on `connectIntent` flag that gates all reconnect attempts.
- **Live Diagnostics**: Built-in "Dev" tab for real-time video state debugging (ReadyState, CurrentTime, etc.).
- **Dynamic i18n (Multi-Language)**: Fully localized in 13 languages (`en`, `de`, `fr`, `es`, `it`, `pl`, `tr`, `nl`, `ja`, `ko`, `pt-BR`, `pt`, `ru`) with auto-detected fallback and dynamic on-the-fly language selectors.
- **Manifest V3**: Service-worker architecture with session persistence and explicit keep-alive handling.
- **Pure Vanilla JS**: No extension runtime dependencies and no bundler inside `extension/`.
- **On-Demand Connection**: The service worker connects only while the user intends to be in a room.
- **Host Control & Co-Hosts**: Hosts can switch a room into `host-only` mode and grant controller rights to trusted peers.
- **Episode Auto-Sync**: Title/episode changes can open a lobby so peers resume together once everyone is ready.
- **Smart Matching & Title Privacy**: Matching video tabs are highlighted, while tab/media title sharing can be reduced or disabled.
- **Audio Processing**: Optional local compressor settings live in the dedicated audio options page.
- **Status Diagnostics**: The Status tab exposes connection state, ping, video debug data, action history, and copyable logs.
- **Dynamic i18n**: 15 languages are supported: `en`, `de`, `fr`, `es`, `it`, `nl`, `pl`, `pt`, `pt-BR`, `tr`, `ru`, `ja`, `ko`, `zh`, and `uk`.
## Tab Overview
1. **Room**: Manage connections, view active peers, and share invitation links.
2. **Sync**: Control video playback (Play/Pause/Force Sync) and view recent activity.
3. **Settings**: Customize your Username, toggle domain-based Noise Filtering, and switch the App Language.
4. **Dev**: Monitor connection status and view real-time video element metadata for debugging.
1. **Room**: Select official/custom server, create or join rooms, view peers, share invite links, and manage Host Control when supported by the relay.
2. **Sync**: Select the video tab, send play/pause/seek/force-sync actions, and view episode lobby state.
3. **Settings**: Configure username, title sharing, noise filtering, auto episode sync, notifications, language, and audio options.
4. **Status**: Inspect connection state, latency, video debug info, history, and logs for bug reports.
5. **Dev**: Hidden developer-only controls shown for the `KoalaDev` username.
## Privacy & Permissions
KoalaSync requires `<all_urls>` permission to detect and interact with video elements (`<video>`) on websites.
- **No Browsing History**: We do not track or store your browsing history.
- **State Management**: Sensitive data (Room Passwords) is stored locally using `chrome.storage`.
- **Zero Telemetry**: No analytics or external tracking scripts.
- **Zero Runtime Dependencies**: The extension is built with pure Vanilla JS and contains no external libraries or tracking scripts, ensuring performance and privacy.
KoalaSync requires `<all_urls>` host permission so it can detect and control `<video>` elements on arbitrary sites.
- No browsing history is collected or uploaded.
- Room credentials and user settings are stored locally with `chrome.storage`.
- No analytics, external scripts, external fonts, or tracking libraries are used by the extension.
- Audio processing is local to the selected tab.
- Title privacy controls decide whether tab/media titles are shared with room peers.
## Installation
1. **Prepare Extension**: From the repository root, run:
```bash
npm run build:extension
```
2. Open Chrome and go to `chrome://extensions/`.
3. Enable **Developer mode** (top right).
4. Click **Load unpacked** and select the `dist/chrome` folder.
From the repository root:
```bash
npm install
npm run build:extension
```
Then load the generated bundle:
- Chrome/Chromium: open `chrome://extensions/`, enable Developer Mode, and load `dist/chrome`.
- Firefox: open `about:debugging`, choose **This Firefox**, and load `dist/firefox/manifest.json`.
## Development
If you modify `shared/constants.js`, you must synchronize the changes by running the build script from the root:
Run the build whenever shared protocol files or extension packaging inputs change:
```bash
npm run build:extension
```
This ensures that the `extension/shared` folder is updated with the latest protocol constants.
The build copies `shared/constants.js`, `shared/blacklist.js`, `shared/names.js`, and `shared/README.md` into `extension/shared/`, injects synchronous constants into `content.js`, generates browser manifests, and creates zip artifacts in `dist/`.
Useful focused checks from the repository root:
```bash
node -c extension/background.js
node -c extension/content.js
node -c extension/popup.js
node scripts/test-episode-utils.mjs
node scripts/test-title-privacy.mjs
node scripts/test-audio-settings.mjs
node scripts/test-locales.cjs
```
For the full suite, run:
```bash
npm run verify
```
## Do Not Break
- Keep `content.js` synchronous and IIFE-based; it cannot import ES modules directly.
- Keep the injection markers used by `scripts/build-extension.cjs`.
- Keep protocol names in `shared/constants.js` as the source of truth.
- Keep extension runtime dependencies at zero unless the project explicitly decides to introduce a bundler.
- Keep all extension assets self-hosted.
## Module Structure
| File | Purpose |
|---|---|
| `background.js` | Service worker: message routing, tab listeners, startup |
| `content.js` | Video detection, audio processing, episode transition (IIFE) |
| `popup.js` | Popup UI: join/create, tabs, status, settings |
| `bridge.js` | Landing page bridge (injected into sync.koalastuff.net) |
| `episode-utils.js` | Shared `extractEpisodeId()` / `sameEpisode()` — used by background.js, injected into content.js at build time |
| `i18n.js` | Translation loader |
| `shared/` | Constants, blacklist, name generator |
| `background.js` | Service worker: WebSocket protocol, room state, host control, tab/content routing, reconnects |
| `content.js` | Video detection/control, audio processing, episode transition, host-only guest behavior |
| `popup.js` | Popup UI: room join/create, tabs, settings, peer list, status, diagnostics |
| `popup.html` | Popup markup, tabs, onboarding, status/debug surfaces |
| `bridge.js` | Invitation bridge injected into `sync.koalastuff.net` |
| `episode-utils.js` | Shared episode-title parser imported by background and injected into content at build time |
| `title-privacy.js` | Tab/media title privacy modes and sanitization helpers |
| `audio-options.html` / `audio-options.js` / `audio-options.css` | Dedicated local audio-processing settings page |
| `page-api-seek-overrides.js` | Page-level seek bridge for site-specific player APIs |
| `modules/tab-manager.js` | Tab lifecycle helper used by the background service worker |
| `i18n.js` | Dynamic locale loader and DOM translation helper |
| `locales/` | Runtime popup translations |
| `_locales/` | Browser-store manifest translations |
| `shared/` | Generated mirror of root shared constants, blacklist, names, and README |
+54 -17
View File
@@ -1,13 +1,46 @@
:root {
--bg: #0f172a;
--card: #1e293b;
--panel: #172033;
--accent: #6366f1;
--accent-hover: #818cf8;
--text: #f8fafc;
--text-muted: #94a3b8;
--border: #334155;
/* KoalaSync nature system: forest neutrals, eucalyptus brand, warm supporting accents. */
--bg-base: oklch(0.23 0.028 155);
--surface: oklch(0.30 0.035 150);
--surface-deep: oklch(0.205 0.025 155);
--surface-alt: oklch(0.265 0.032 150);
--border-soft: oklch(0.88 0.025 145 / 0.09);
--border-strong: oklch(0.39 0.038 145);
--text-primary: oklch(0.96 0.01 90);
--text-secondary: oklch(0.78 0.02 90);
--accent-green: oklch(0.73 0.13 155);
--accent-green-hover: oklch(0.79 0.12 155);
--accent-terracotta: oklch(0.62 0.14 45);
--success-green: oklch(0.72 0.14 135);
--warning-amber: oklch(0.76 0.14 80);
--danger: oklch(0.55 0.15 25);
--text-on-green: oklch(0.14 0.02 90);
--bg: var(--bg-base);
--card: var(--surface);
--panel: var(--surface-alt);
--accent: var(--accent-green);
--accent-hover: var(--accent-green-hover);
--text: var(--text-primary);
--text-muted: var(--text-secondary);
--border: var(--border-strong);
--radius: 8px;
color-scheme: dark;
}
html.theme-light {
--bg-base: oklch(0.965 0.012 105);
--surface: oklch(0.995 0.006 100);
--surface-deep: oklch(0.935 0.018 110);
--surface-alt: oklch(0.91 0.022 115);
--border-soft: oklch(0.28 0.035 140 / 0.10);
--border-strong: oklch(0.73 0.035 125);
--text-primary: oklch(0.21 0.03 140);
--text-secondary: oklch(0.43 0.03 135);
--accent-green: oklch(0.52 0.13 155);
--accent-green-hover: oklch(0.45 0.12 155);
--text-on-green: oklch(0.98 0.005 100);
color-scheme: light;
}
* {
@@ -55,7 +88,7 @@ body {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
letter-spacing: 0.04em;
}
h1,
@@ -83,6 +116,10 @@ h2 {
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
}
html.theme-light .panel {
box-shadow: 0 12px 30px oklch(0.22 0.035 140 / 0.09);
}
.muted-panel {
color: var(--text-muted);
}
@@ -101,7 +138,7 @@ h2 {
color: var(--text-muted);
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.01em;
}
.preset-group {
@@ -125,12 +162,12 @@ h2 {
transition: border-color 0.2s, box-shadow 0.2s;
}
.preset-card:hover {
border-color: rgba(99, 102, 241, 0.4);
border-color: color-mix(in oklch, var(--accent), transparent 60%);
}
.preset-card:has(input:checked) {
border-color: var(--accent);
box-shadow: 0 0 0 1px rgba(99, 102, 241, 0.35);
box-shadow: 0 0 0 1px color-mix(in oklch, var(--accent), transparent 65%);
}
.preset-card input {
@@ -141,8 +178,8 @@ h2 {
display: grid;
gap: 12px;
padding: 16px;
background: rgba(15, 23, 42, 0.58);
border: 1px solid rgba(148, 163, 184, 0.16);
background: var(--surface-deep);
border: 1px solid var(--border-soft);
border-radius: var(--radius);
transition: opacity 0.3s;
}
@@ -158,7 +195,7 @@ h2 {
color: var(--text-muted);
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.01em;
}
input[type="range"] {
@@ -204,7 +241,7 @@ input[type="number"]:focus {
position: absolute;
cursor: pointer;
inset: 0;
background-color: #334155;
background-color: var(--border-strong);
transition: .3s;
border-radius: 22px;
}
@@ -216,7 +253,7 @@ input[type="number"]:focus {
width: 16px;
left: 3px;
bottom: 3px;
background-color: #94a3b8;
background-color: var(--text-secondary);
transition: .3s;
border-radius: 50%;
}
+1
View File
@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<title>KoalaSync Audio Settings</title>
<script src="theme-init.js"></script>
<link rel="stylesheet" href="audio-options.css">
</head>
<body>
+26 -4
View File
@@ -1,7 +1,7 @@
import { EVENTS, CONTROL_MODES, CAPABILITIES, PROTOCOL_VERSION, OFFICIAL_SERVER_URL, OFFICIAL_SERVER_TOKEN, EPISODE_LOBBY_TIMEOUT, FORCE_SYNC_TIMEOUT, HEARTBEAT_INTERVAL } from './shared/constants.js';
import { generateUsername } from './shared/names.js';
import { loadLocale, getMessage, getSystemLanguage } from './i18n.js';
import { sameEpisode } from './episode-utils.js';
import { sameEpisode, extractEpisodeId } from './episode-utils.js';
import { applyTitlePrivacyToPayload, sanitizeSharedTitle, sanitizeTabTitle, normalizeSendTabTitle, normalizeTitlePrivacyMode } from './title-privacy.js';
import { initTabManager } from './modules/tab-manager.js';
import './page-api-seek-overrides.js';
@@ -790,13 +790,13 @@ function updateBadgeStatus() {
if (status === 'reconnecting') {
chrome.action.setBadgeText({ text: '...' });
chrome.action.setBadgeBackgroundColor({ color: '#f59e0b' });
chrome.action.setBadgeBackgroundColor({ color: '#c96736' });
} else if (status === 'connecting') {
chrome.action.setBadgeText({ text: '...' });
chrome.action.setBadgeBackgroundColor({ color: '#fbbf24' });
chrome.action.setBadgeBackgroundColor({ color: '#de7949' });
} else if (status === 'connected' && currentRoom && currentTabId) {
chrome.action.setBadgeText({ text: 'ON' });
chrome.action.setBadgeBackgroundColor({ color: '#22c55e' });
chrome.action.setBadgeBackgroundColor({ color: '#56ae6c' });
} else {
chrome.action.setBadgeText({ text: '' });
}
@@ -1325,6 +1325,9 @@ function handleServerEvent(event, data) {
}
if (storageInitialized) chrome.storage.session.set({ currentRoom });
chrome.runtime.sendMessage({ type: 'PEER_UPDATE', peers: currentRoom.peers }).catch(() => {});
if (episodeLobby) {
checkEpisodeLobbyCompletion();
}
}
}
}
@@ -2476,6 +2479,11 @@ async function handleAsyncMessage(message, sender, sendResponse) {
}
const newTitle = message.payload && message.payload.newTitle;
if (newTitle && extractEpisodeId(newTitle) === null) {
addLog(`Episode change detected ("${newTitle}") but no episode ID was found; ignoring.`, 'info');
sendResponse({ status: 'not_an_episode' });
return;
}
if (!newTitle) {
sendResponse({ status: 'no_title' });
return;
@@ -2566,6 +2574,13 @@ async function handleAsyncMessage(message, sender, sendResponse) {
sendResponse({ status: 'lobby_created' });
} else if (message.type === 'EPISODE_READY_LOCAL') {
if (sender.tab) {
const senderTabId = sender.tab.id;
if (!currentTabId || currentTabId !== senderTabId) {
sendResponse({ status: 'ignored_unselected_tab' });
return;
}
}
// Content script confirmed it loaded the lobby episode
if (episodeLobby && message.payload && sameEpisode(message.payload.title, episodeLobby.expectedTitle)) {
if (!episodeLobby.readyPeers.includes(peerId)) {
@@ -2604,6 +2619,13 @@ async function handleAsyncMessage(message, sender, sendResponse) {
}
sendResponse({ status: 'ok' });
} else if (message.type === 'CONTENT_BOOT') {
if (sender.tab) {
const senderTabId = sender.tab.id;
if (!currentTabId || currentTabId !== senderTabId) {
sendResponse({ status: 'ignored_unselected_tab' });
return;
}
}
// Content script re-injected, check if there's an active lobby
if (episodeLobby) {
sendResponse({ lobbyActive: true, expectedTitle: episodeLobby.expectedTitle });
+14 -9
View File
@@ -15,7 +15,7 @@
window.koalaSyncInjected = true;
// --- SHARED_EVENTS_INJECT_START ---
// This block is automatically updated by /scripts/build-extension.js
// This block is automatically updated by /scripts/build-extension.cjs
const EVENTS = {
PLAY: "play",
PAUSE: "pause",
@@ -424,13 +424,13 @@
const host = hcmEl('div', 'all:initial');
const root = host.attachShadow({ mode: 'open' });
const wrap = hcmEl('div', 'position:fixed;z-index:2147483647;left:50%;bottom:32px;transform:translateX(-50%);background:#1f2937;color:#f9fafb;font:14px/1.4 system-ui,sans-serif;padding:16px 18px;border-radius:12px;box-shadow:0 8px 30px rgba(0,0,0,.45);max-width:360px;border:1px solid #374151');
const wrap = hcmEl('div', 'position:fixed;z-index:2147483647;left:50%;bottom:32px;transform:translateX(-50%);background:#212a17;color:#f4f2ea;font:14px/1.4 system-ui,sans-serif;padding:16px 18px;border-radius:12px;box-shadow:0 8px 30px rgba(0,0,0,.45);max-width:360px;border:1px solid #2f3625');
wrap.setAttribute('role', 'dialog');
const title = hcmEl('div', 'font-weight:600;margin-bottom:6px', hcmStrings.title);
const body = hcmEl('div', 'margin-bottom:12px;color:#d1d5db', hcmStrings.body);
const body = hcmEl('div', 'margin-bottom:12px;color:#bcb7a9', hcmStrings.body);
const btnRow = hcmEl('div', 'display:flex;gap:8px;justify-content:flex-end');
const soloBtn = hcmEl('button', 'background:#374151;color:#f9fafb;border:0;padding:8px 12px;border-radius:8px;cursor:pointer', hcmStrings.solo);
const stayBtn = hcmEl('button', 'background:#10b981;color:#062a20;border:0;padding:8px 12px;border-radius:8px;cursor:pointer;font-weight:600', hcmStrings.stay);
const soloBtn = hcmEl('button', 'background:#2f3625;color:#f4f2ea;border:0;padding:8px 12px;border-radius:8px;cursor:pointer', hcmStrings.solo);
const stayBtn = hcmEl('button', 'background:#56ae6c;color:#0a1a0d;border:0;padding:8px 12px;border-radius:8px;cursor:pointer;font-weight:600', hcmStrings.stay);
btnRow.append(soloBtn, stayBtn);
wrap.append(title, body, btnRow);
root.appendChild(wrap);
@@ -494,7 +494,7 @@
}
const host = hcmEl('div', 'all:initial');
const root = host.attachShadow({ mode: 'open' });
const b = hcmEl('div', 'position:fixed;z-index:2147483646;right:16px;bottom:16px;background:#b45309;color:#fff;font:13px/1.3 system-ui,sans-serif;padding:8px 12px;border-radius:10px;box-shadow:0 6px 20px rgba(0,0,0,.4);cursor:pointer;display:flex;align-items:center;gap:8px');
const b = hcmEl('div', 'position:fixed;z-index:2147483646;right:16px;bottom:16px;background:#c96736;color:#fff;font:13px/1.3 system-ui,sans-serif;padding:8px 12px;border-radius:10px;box-shadow:0 6px 20px rgba(0,0,0,.4);cursor:pointer;display:flex;align-items:center;gap:8px');
b.append(hcmEl('span', null, '● ' + hcmStrings.badge), hcmEl('span', 'text-decoration:underline', hcmStrings.resync));
b.addEventListener('click', hcmExitDesync);
root.appendChild(b);
@@ -717,7 +717,7 @@
// Handles: S01E01, S1E1, S01 - E01, Season 1 Episode 1, "Folge 5", "Episode 5", "Ep. 5", "#5"
// Returns null if no episode pattern found.
// --- SHARED_EPISODE_UTILS_INJECT_START ---
// This block is automatically replaced by /scripts/build-extension.js
// This block is automatically replaced by /scripts/build-extension.cjs
function extractEpisodeId(title) {
if (!title || typeof title !== 'string') return null;
const se = title.match(/S(?:eason\s*)?(\d+)[^a-zA-Z0-9]*E(?:pisode\s*)?(\d+)/i);
@@ -758,7 +758,8 @@
// Only trigger if: we had a previous title, the title changed,
// a video exists, and we're near the start of new content.
if (lastKnownMediaTitle && currentTitle
&& !sameEpisode(currentTitle, lastKnownMediaTitle)
&& !sameEpisode(currentTitle, lastKnownMediaTitle)
&& extractEpisodeId(currentTitle) !== null
&& video
&& current !== null && current < 5
&& video.readyState >= 1) {
@@ -798,7 +799,11 @@
const current = video ? getSyncCurrentTime(video) : null;
if (video && currentTitle && sameEpisode(currentTitle, expectedTitle)
&& current !== null && current < 5 && video.readyState >= 1) {
&& current !== null && video.readyState >= 1) {
if (current >= 5) {
expectedSeekTime = 0;
video.currentTime = 0;
}
// Match! Pause at start and report ready.
if (!video.paused) {
_setSuppress('paused');
+1 -1
View File
@@ -1,6 +1,6 @@
/**
* KoalaSync Episode Title Utilities
* Single source of truth synced to content.js by build-extension.js.
* Single source of truth synced to content.js by build-extension.cjs.
* Keep in sync with the injection block in content.js!
*/
+5
View File
@@ -12,6 +12,9 @@ let currentLanguage = null;
*/
export async function loadLocale(langCode) {
const resolvedLang = SUPPORTED_LANGUAGES.includes(langCode) ? langCode : DEFAULT_LANGUAGE;
if (typeof document !== 'undefined') {
document.documentElement.lang = resolvedLang;
}
if (currentLanguage === resolvedLang && Object.keys(activeDictionary).length > 0) {
return;
@@ -90,6 +93,8 @@ export function getMessage(key, placeholders = null) {
* Performs dynamic DOM replacements for elements carrying data-i18n attributes.
*/
export function translateDOM() {
if (typeof document === 'undefined') return;
// 1. Text Content
document.querySelectorAll('[data-i18n]').forEach(el => {
const key = el.getAttribute('data-i18n');
+3
View File
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path d="M3 2.5h4v11H3zm6 0h4v11H9z"/>
</svg>

After

Width:  |  Height:  |  Size: 109 B

+3
View File
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path d="M4 2.6v10.8L13 8z"/>
</svg>

After

Width:  |  Height:  |  Size: 100 B

+3
View File
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path d="M13.4 5.5A5.8 5.8 0 0 0 3 4.2L1.7 2.9v4.4h4.4L4.4 5.6a4 4 0 0 1 7.2.8zM2.6 10.5A5.8 5.8 0 0 0 13 11.8l1.3 1.3V8.7H9.9l1.7 1.7a4 4 0 0 1-7.2-.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 226 B

+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Fernsteuerung",
"BTN_COPY_INVITE": "📋 Einladungslink",
"BTN_COPY_INVITE_TOOLTIP": "Einladungslink kopieren",
"BTN_PLAY": "Abspielen",
"BTN_PLAY": "Abspielen",
"BTN_PLAY_TOOLTIP": "Sende einen Play-Befehl an alle",
"BTN_PAUSE": "Pause",
"BTN_PAUSE": "Pause",
"BTN_PAUSE_TOOLTIP": "Sende einen Pause-Befehl an alle",
"BTN_SYNC": "⚡ SYNC",
"BTN_SYNC": "Sync",
"BTN_SYNC_TOOLTIP": "Erzwinge die Synchronisation aller Teilnehmer",
"OPTION_JUMP_TO_OTHERS": "Zu anderen springen",
"OPTION_JUMP_TO_ME": "Zu mir springen",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Wendet Audioeffekte wie Kompression auf die Videowiedergabe an",
"AUDIO_OPEN_SETTINGS": "Öffnen",
"NEW_FEATURE_AUDIO": "Neu: Audio-Verarbeitung — probiere den Kompressor aus!",
"NEW_FEATURE_THEME": "Neu: Themes — wechsle zum klassischen Look oder minimalem Graphit.",
"AUDIO_BACK": "← Zurück",
"AUDIO_PAGE_TITLE": "Audio-Einstellungen",
"AUDIO_MASTER_TOGGLE": "Audio-Verarbeitung",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Tab-Titel senden",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Sendet den Titel des ausgewählten Browser-Tabs an den Raum.",
"LABEL_MEDIA_TITLE_PRIVACY": "Medientitel",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Lege fest, wie Medientitel an den Raum gesendet werden."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Lege fest, wie Medientitel an den Raum gesendet werden.",
"LABEL_SETTINGS_GROUP_PROFILE": "Profil & Aussehen",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Ändere deinen Benutzernamen, dein Design und deine Spracheinstellungen.",
"LABEL_SETTINGS_GROUP_SYNC": "Wiedergabe & Sync",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Passe Wiedergabe-, Benachrichtigungs- und Audioeinstellungen an."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Remote Control",
"BTN_COPY_INVITE": "📋 Invite Link",
"BTN_COPY_INVITE_TOOLTIP": "Copy Invite Link",
"BTN_PLAY": "Play",
"BTN_PLAY": "Play",
"BTN_PLAY_TOOLTIP": "Send a Play command to everyone",
"BTN_PAUSE": "Pause",
"BTN_PAUSE": "Pause",
"BTN_PAUSE_TOOLTIP": "Send a Pause command to everyone",
"BTN_SYNC": "⚡ SYNC",
"BTN_SYNC": "Sync",
"BTN_SYNC_TOOLTIP": "Force all users to sync up",
"OPTION_JUMP_TO_OTHERS": "Jump to Others",
"OPTION_JUMP_TO_ME": "Jump to Me",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Apply audio effects like compression to video playback",
"AUDIO_OPEN_SETTINGS": "Open",
"NEW_FEATURE_AUDIO": "New: Audio Processing — try the compressor!",
"NEW_FEATURE_THEME": "New: Themes — switch to the classic look or minimal graphite.",
"AUDIO_BACK": "← Back",
"AUDIO_PAGE_TITLE": "Audio Settings",
"AUDIO_MASTER_TOGGLE": "Audio Processing",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Send tab title",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Send the selected browser tab title to the room.",
"LABEL_MEDIA_TITLE_PRIVACY": "Media title",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Choose how media titles are sent to the room."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Choose how media titles are sent to the room.",
"LABEL_SETTINGS_GROUP_PROFILE": "Profile & Appearance",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Change your username, theme, and language preferences.",
"LABEL_SETTINGS_GROUP_SYNC": "Playback & Sync",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Customize playback, notifications, and audio preferences."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Control remoto",
"BTN_COPY_INVITE": "📋 Enlace de invitación",
"BTN_COPY_INVITE_TOOLTIP": "Copiar enlace de invitación",
"BTN_PLAY": "Reproducir",
"BTN_PLAY": "Reproducir",
"BTN_PLAY_TOOLTIP": "Enviar un comando de reproducción a todos",
"BTN_PAUSE": "Pausar",
"BTN_PAUSE": "Pausar",
"BTN_PAUSE_TOOLTIP": "Enviar un comando de pausa a todos",
"BTN_SYNC": "⚡ SYNC",
"BTN_SYNC": "Sync",
"BTN_SYNC_TOOLTIP": "Forzar la sincronización de todos los usuarios",
"OPTION_JUMP_TO_OTHERS": "Ir a la posición de otros",
"OPTION_JUMP_TO_ME": "Traerlos a mi posición",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Aplica efectos de audio como compresión a la reproducción de video",
"AUDIO_OPEN_SETTINGS": "Abrir",
"NEW_FEATURE_AUDIO": "Nuevo: Procesamiento de audio — ¡prueba el compresor!",
"NEW_FEATURE_THEME": "Nuevo: Temas — cambia al aspecto clásico o al grafito minimalista.",
"AUDIO_BACK": "← Volver",
"AUDIO_PAGE_TITLE": "Configuración de audio",
"AUDIO_MASTER_TOGGLE": "Procesamiento de audio",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Enviar título de pestaña",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Envía a la sala el título de la pestaña del navegador seleccionada.",
"LABEL_MEDIA_TITLE_PRIVACY": "Título multimedia",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Elige cómo se envían los títulos multimedia a la sala."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Elige cómo se envían los títulos multimedia a la sala.",
"LABEL_SETTINGS_GROUP_PROFILE": "Perfil y Apariencia",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Cambia tu nombre de usuario, tema y preferencias de idioma.",
"LABEL_SETTINGS_GROUP_SYNC": "Reproducción y Sincronización",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Personaliza la reproducción, las notificaciones y las preferencias de audio."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Contrôle à distance",
"BTN_COPY_INVITE": "📋 Lien d'invitation",
"BTN_COPY_INVITE_TOOLTIP": "Copier le lien d'invitation",
"BTN_PLAY": "Lecture",
"BTN_PLAY": "Lecture",
"BTN_PLAY_TOOLTIP": "Envoyer une commande Lecture à tout le monde",
"BTN_PAUSE": "Pause",
"BTN_PAUSE": "Pause",
"BTN_PAUSE_TOOLTIP": "Envoyer une commande Pause à tout le monde",
"BTN_SYNC": "⚡ SYNC",
"BTN_SYNC": "Sync",
"BTN_SYNC_TOOLTIP": "Forcer tous les utilisateurs à se synchroniser",
"OPTION_JUMP_TO_OTHERS": "Rejoindre les autres",
"OPTION_JUMP_TO_ME": "Les amener à moi",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Applique des effets audio comme la compression à la lecture vidéo",
"AUDIO_OPEN_SETTINGS": "Ouvrir",
"NEW_FEATURE_AUDIO": "Nouveau : Traitement audio — essayez le compresseur !",
"NEW_FEATURE_THEME": "Nouveau : Thèmes — passez au look classique ou au graphite minimal.",
"AUDIO_BACK": "← Retour",
"AUDIO_PAGE_TITLE": "Paramètres audio",
"AUDIO_MASTER_TOGGLE": "Traitement audio",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Envoyer le titre de longlet",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Envoie au salon le titre de longlet de navigateur sélectionné.",
"LABEL_MEDIA_TITLE_PRIVACY": "Titre du média",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Choisissez comment les titres des médias sont envoyés au salon."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Choisissez comment les titres des médias sont envoyés au salon.",
"LABEL_SETTINGS_GROUP_PROFILE": "Profil & Apparence",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Modifiez votre nom d'utilisateur, votre thème et vos préférences linguistiques.",
"LABEL_SETTINGS_GROUP_SYNC": "Lecture & Sync",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Personnalisez la lecture, les notifications et les préférences audio."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Telecomando",
"BTN_COPY_INVITE": "📋 Link di Invito",
"BTN_COPY_INVITE_TOOLTIP": "Copia il link di invito",
"BTN_PLAY": "Riproduci",
"BTN_PLAY": "Riproduci",
"BTN_PLAY_TOOLTIP": "Avvia la riproduzione per tutti",
"BTN_PAUSE": "Pausa",
"BTN_PAUSE": "Pausa",
"BTN_PAUSE_TOOLTIP": "Metti in pausa per tutti",
"BTN_SYNC": "⚡ SINCRO",
"BTN_SYNC": "Sincro",
"BTN_SYNC_TOOLTIP": "Forza la sincronizzazione per tutti",
"OPTION_JUMP_TO_OTHERS": "Vai alla posizione degli altri",
"OPTION_JUMP_TO_ME": "Portali alla mia posizione",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Applica effetti sonori (come il compressore) ai video",
"AUDIO_OPEN_SETTINGS": "Apri",
"NEW_FEATURE_AUDIO": "Novità: Elaborazione Audio — prova il compressore!",
"NEW_FEATURE_THEME": "Nuovo: Temi — passa all'aspetto classico o al grafite minimale.",
"AUDIO_BACK": "← Indietro",
"AUDIO_PAGE_TITLE": "Impostazioni Audio",
"AUDIO_MASTER_TOGGLE": "Elaborazione Audio",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Invia titolo scheda",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Invia alla stanza il titolo della scheda del browser selezionata.",
"LABEL_MEDIA_TITLE_PRIVACY": "Titolo multimediale",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Scegli come inviare alla stanza i titoli multimediali."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Scegli come inviare alla stanza i titoli multimediali.",
"LABEL_SETTINGS_GROUP_PROFILE": "Profilo & Aspetto",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Modifica il tuo nome utente, tema e preferenze di lingua.",
"LABEL_SETTINGS_GROUP_SYNC": "Riproduzione & Sync",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Personalizza la riproduzione, le notifiche e le preferenze audio."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "リモートコントロール",
"BTN_COPY_INVITE": "📋 招待リンク",
"BTN_COPY_INVITE_TOOLTIP": "招待リンクをコピー",
"BTN_PLAY": "再生",
"BTN_PLAY": "再生",
"BTN_PLAY_TOOLTIP": "全員に再生コマンドを送信",
"BTN_PAUSE": "一時停止",
"BTN_PAUSE": "一時停止",
"BTN_PAUSE_TOOLTIP": "全員に一時停止コマンドを送信",
"BTN_SYNC": "同期",
"BTN_SYNC": "同期",
"BTN_SYNC_TOOLTIP": "すべてのユーザーを強制的に同期",
"OPTION_JUMP_TO_OTHERS": "他の人に合わせる",
"OPTION_JUMP_TO_ME": "自分に合わせる",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "動画再生に圧縮などのオーディオエフェクトを適用します",
"AUDIO_OPEN_SETTINGS": "開く",
"NEW_FEATURE_AUDIO": "新機能: オーディオ処理 — コンプレッサーを試してみよう!",
"NEW_FEATURE_THEME": "新機能:テーマ — クラシックな外観やミニマルなグラファイトに切り替え。",
"AUDIO_BACK": "← 戻る",
"AUDIO_PAGE_TITLE": "オーディオ設定",
"AUDIO_MASTER_TOGGLE": "オーディオ処理",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "タブタイトルを送信",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "選択中のブラウザータブのタイトルをルームに送信します。",
"LABEL_MEDIA_TITLE_PRIVACY": "メディアタイトル",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "メディアタイトルをルームに送信する方法を選択します。"
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "メディアタイトルをルームに送信する方法を選択します。",
"LABEL_SETTINGS_GROUP_PROFILE": "プロフィールと外観",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "ユーザー名、テーマ、言語設定を変更します。",
"LABEL_SETTINGS_GROUP_SYNC": "再生と同期",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "再生、通知、オーディオ設定をカスタマイズします。"
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "원격 제어",
"BTN_COPY_INVITE": "📋 초대 링크",
"BTN_COPY_INVITE_TOOLTIP": "초대 링크 복사",
"BTN_PLAY": "재생",
"BTN_PLAY": "재생",
"BTN_PLAY_TOOLTIP": "모든 사람에게 재생 명령 전송",
"BTN_PAUSE": "일시정지",
"BTN_PAUSE": "일시정지",
"BTN_PAUSE_TOOLTIP": "모든 사람에게 일시정지 명령 전송",
"BTN_SYNC": "동기화",
"BTN_SYNC": "동기화",
"BTN_SYNC_TOOLTIP": "모든 사용자의 강제 동기화",
"OPTION_JUMP_TO_OTHERS": "다른 사람에게 이동",
"OPTION_JUMP_TO_ME": "나에게 이동",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "비디오 재생에 압축과 같은 오디오 효과를 적용합니다",
"AUDIO_OPEN_SETTINGS": "열기",
"NEW_FEATURE_AUDIO": "신규: 오디오 처리 — 컴프레서를 사용해보세요!",
"NEW_FEATURE_THEME": "신규: 테마 — 클래식 룩이나 미니멀 그래파이트로 전환하세요.",
"AUDIO_BACK": "← 뒤로",
"AUDIO_PAGE_TITLE": "오디오 설정",
"AUDIO_MASTER_TOGGLE": "오디오 처리",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "탭 제목 보내기",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "선택한 브라우저 탭 제목을 방에 보냅니다.",
"LABEL_MEDIA_TITLE_PRIVACY": "미디어 제목",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "미디어 제목을 방에 보내는 방식을 선택합니다."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "미디어 제목을 방에 보내는 방식을 선택합니다.",
"LABEL_SETTINGS_GROUP_PROFILE": "프로필 및 테마",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "사용자 이름, 테마 및 언어 설정을 변경합니다.",
"LABEL_SETTINGS_GROUP_SYNC": "재생 및 동기화",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "재생, 알림 및 오디오 설정을 맞춤설정합니다."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Afstandsbediening",
"BTN_COPY_INVITE": "📋 Uitnodigingslink",
"BTN_COPY_INVITE_TOOLTIP": "Uitnodigingslink kopiëren",
"BTN_PLAY": "Afspelen",
"BTN_PLAY": "Afspelen",
"BTN_PLAY_TOOLTIP": "Stuur een afspeelopdracht naar iedereen",
"BTN_PAUSE": "Pauzeren",
"BTN_PAUSE": "Pauzeren",
"BTN_PAUSE_TOOLTIP": "Stuur een pauzeeropdracht naar iedereen",
"BTN_SYNC": "⚡ SYNC",
"BTN_SYNC": "Sync",
"BTN_SYNC_TOOLTIP": "Dwing alle gebruikers om te synchroniseren",
"OPTION_JUMP_TO_OTHERS": "Spring naar anderen",
"OPTION_JUMP_TO_ME": "Spring naar mij",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Past audio-effecten zoals compressie toe op video-afspelen",
"AUDIO_OPEN_SETTINGS": "Openen",
"NEW_FEATURE_AUDIO": "Nieuw: Audioverwerking — probeer de compressor!",
"NEW_FEATURE_THEME": "Nieuw: Thema's — schakel naar de klassieke look of minimaal grafiet.",
"AUDIO_BACK": "← Terug",
"AUDIO_PAGE_TITLE": "Audio-instellingen",
"AUDIO_MASTER_TOGGLE": "Audioverwerking",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Tabtitel verzenden",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Stuurt de titel van het geselecteerde browsertabblad naar de kamer.",
"LABEL_MEDIA_TITLE_PRIVACY": "Mediatitel",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Kies hoe mediatitels naar de kamer worden gestuurd."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Kies hoe mediatitels naar de kamer worden gestuurd.",
"LABEL_SETTINGS_GROUP_PROFILE": "Profiel & Weergave",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Wijzig uw gebruikersnaam, thema en taalvoorkeuren.",
"LABEL_SETTINGS_GROUP_SYNC": "Afspelen & Sync",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Pas afspelen, meldingen en audiovoorkeuren aan."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Zdalne sterowanie",
"BTN_COPY_INVITE": "📋 Link do zaproszenia",
"BTN_COPY_INVITE_TOOLTIP": "Kopiuj link zaproszenia",
"BTN_PLAY": "Odtwórz",
"BTN_PLAY": "Odtwórz",
"BTN_PLAY_TOOLTIP": "Wyślij polecenie odtwarzania do wszystkich",
"BTN_PAUSE": "Pauza",
"BTN_PAUSE": "Pauza",
"BTN_PAUSE_TOOLTIP": "Wyślij polecenie pauzy do wszystkich",
"BTN_SYNC": "⚡ SYNC",
"BTN_SYNC": "Sync",
"BTN_SYNC_TOOLTIP": "Wymuś synchronizację wszystkich użytkowników",
"OPTION_JUMP_TO_OTHERS": "Skocz do innych",
"OPTION_JUMP_TO_ME": "Skocz do mnie",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Stosuje efekty dźwiękowe, takie jak kompresja, do odtwarzania wideo",
"AUDIO_OPEN_SETTINGS": "Otwórz",
"NEW_FEATURE_AUDIO": "Nowość: Przetwarzanie dźwięku — wypróbuj kompresor!",
"NEW_FEATURE_THEME": "Nowość: Motywy — przełącz na klasyczny wygląd lub minimalny grafit.",
"AUDIO_BACK": "← Wstecz",
"AUDIO_PAGE_TITLE": "Ustawienia dźwięku",
"AUDIO_MASTER_TOGGLE": "Przetwarzanie dźwięku",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Wysyłaj tytuł karty",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Wysyła do pokoju tytuł wybranej karty przeglądarki.",
"LABEL_MEDIA_TITLE_PRIVACY": "Tytuł multimediów",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Wybierz, jak tytuły multimediów są wysyłane do pokoju."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Wybierz, jak tytuły multimediów są wysyłane do pokoju.",
"LABEL_SETTINGS_GROUP_PROFILE": "Profil i Wygląd",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Zmień swoją nazwę użytkownika, motyw i preferencje językowe.",
"LABEL_SETTINGS_GROUP_SYNC": "Odtwarzanie i Sync",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Dostosuj odtwarzanie, powiadomienia i preferencje audio."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Controle remoto",
"BTN_COPY_INVITE": "📋 Link de convite",
"BTN_COPY_INVITE_TOOLTIP": "Copiar link de convite",
"BTN_PLAY": "Reproduzir",
"BTN_PLAY": "Reproduzir",
"BTN_PLAY_TOOLTIP": "Iniciar a reprodução para todos",
"BTN_PAUSE": "Pausar",
"BTN_PAUSE": "Pausar",
"BTN_PAUSE_TOOLTIP": "Pausar o vídeo para todos",
"BTN_SYNC": "⚡ SINCRO",
"BTN_SYNC": "Sincro",
"BTN_SYNC_TOOLTIP": "Forçar todos os usuários a sincronizar",
"OPTION_JUMP_TO_OTHERS": "Ir para a posição dos outros",
"OPTION_JUMP_TO_ME": "Trazer para a minha posição",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Aplica efeitos de áudio (como compressão) aos vídeos",
"AUDIO_OPEN_SETTINGS": "Abrir",
"NEW_FEATURE_AUDIO": "Novo: Processamento de áudio — experimente o compressor!",
"NEW_FEATURE_THEME": "Novo: Temas — mude para o visual clássico ou grafite minimalista.",
"AUDIO_BACK": "← Voltar",
"AUDIO_PAGE_TITLE": "Configurações de áudio",
"AUDIO_MASTER_TOGGLE": "Processamento de áudio",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Enviar título da aba",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Envia para a sala o título da aba selecionada do navegador.",
"LABEL_MEDIA_TITLE_PRIVACY": "Título da mídia",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Escolha como os títulos de mídia são enviados para a sala."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Escolha como os títulos de mídia são enviados para a sala.",
"LABEL_SETTINGS_GROUP_PROFILE": "Perfil e Aparência",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Altere o seu nome de usuário, tema e preferências de idioma.",
"LABEL_SETTINGS_GROUP_SYNC": "Reprodução e Sincronização",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Personalize a reprodução, as notificações e as preferências de áudio."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Controlo Remoto",
"BTN_COPY_INVITE": "📋 Link de Convite",
"BTN_COPY_INVITE_TOOLTIP": "Copiar Link de Convite",
"BTN_PLAY": "Reproduzir",
"BTN_PLAY": "Reproduzir",
"BTN_PLAY_TOOLTIP": "Iniciar a reprodução para todos",
"BTN_PAUSE": "Pausa",
"BTN_PAUSE": "Pausa",
"BTN_PAUSE_TOOLTIP": "Pausar o vídeo para todos",
"BTN_SYNC": "⚡ SINCRO",
"BTN_SYNC": "Sincro",
"BTN_SYNC_TOOLTIP": "Forçar sincronização de todos os utilizadores",
"OPTION_JUMP_TO_OTHERS": "Ir para a posição dos outros",
"OPTION_JUMP_TO_ME": "Trazer para a minha posição",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Aplica efeitos de áudio (como compressão) aos vídeos",
"AUDIO_OPEN_SETTINGS": "Abrir",
"NEW_FEATURE_AUDIO": "Novo: Processamento de áudio — experimente o compressor!",
"NEW_FEATURE_THEME": "Novo: Temas — mude para o visual clássico ou grafite minimalista.",
"AUDIO_BACK": "← Voltar",
"AUDIO_PAGE_TITLE": "Configurações de Áudio",
"AUDIO_MASTER_TOGGLE": "Processamento de Áudio",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Enviar título do separador",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Envia para a sala o título do separador do navegador selecionado.",
"LABEL_MEDIA_TITLE_PRIVACY": "Título multimédia",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Escolhe como os títulos multimédia são enviados para a sala."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Escolhe como os títulos multimédia são enviados para a sala.",
"LABEL_SETTINGS_GROUP_PROFILE": "Perfil e Aparência",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Altere o seu nome de utilizador, tema e preferências de idioma.",
"LABEL_SETTINGS_GROUP_SYNC": "Reprodução e Sincronização",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Personalize a reprodução, as notificações e as preferências de áudio."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Дистанционное управление",
"BTN_COPY_INVITE": "📋 Ссылка",
"BTN_COPY_INVITE_TOOLTIP": "Копировать ссылку-приглашение",
"BTN_PLAY": "Запуск",
"BTN_PLAY": "Запуск",
"BTN_PLAY_TOOLTIP": "Отправить команду воспроизведения всем",
"BTN_PAUSE": "Пауза",
"BTN_PAUSE": "Пауза",
"BTN_PAUSE_TOOLTIP": "Отправить команду паузы всем",
"BTN_SYNC": "⚡ СИНХРО",
"BTN_SYNC": "Синхро",
"BTN_SYNC_TOOLTIP": "Принудительно синхронизировать всех участников",
"OPTION_JUMP_TO_OTHERS": "Перейти к другим",
"OPTION_JUMP_TO_ME": "Синхронизировать по мне",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Применяет аудиоэффекты, такие как сжатие, к воспроизведению видео",
"AUDIO_OPEN_SETTINGS": "Открыть",
"NEW_FEATURE_AUDIO": "Новое: Обработка звука — попробуйте компрессор!",
"NEW_FEATURE_THEME": "Новое: Темы — переключитесь на классический вид или минимальный графит.",
"AUDIO_BACK": "← Назад",
"AUDIO_PAGE_TITLE": "Настройки звука",
"AUDIO_MASTER_TOGGLE": "Обработка звука",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Отправлять название вкладки",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Отправляет в комнату название выбранной вкладки браузера.",
"LABEL_MEDIA_TITLE_PRIVACY": "Название медиа",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Выберите, как названия медиа отправляются в комнату."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Выберите, как названия медиа отправляются в комнату.",
"LABEL_SETTINGS_GROUP_PROFILE": "Профиль и Оформление",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Измените имя пользователя, тему и настройки языка.",
"LABEL_SETTINGS_GROUP_SYNC": "Воспроизведение и Синхронизация",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Настройте воспроизведение, уведомления и параметры звука."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Uzaktan Kumanda",
"BTN_COPY_INVITE": "📋 Davet Linki",
"BTN_COPY_INVITE_TOOLTIP": "Davet Linkini Kopyala",
"BTN_PLAY": "Oynat",
"BTN_PLAY": "Oynat",
"BTN_PLAY_TOOLTIP": "Herkese Oynat komutu gönder",
"BTN_PAUSE": "Duraklat",
"BTN_PAUSE": "Duraklat",
"BTN_PAUSE_TOOLTIP": "Herkese Duraklat komutu gönder",
"BTN_SYNC": "⚡ SYNC",
"BTN_SYNC": "Sync",
"BTN_SYNC_TOOLTIP": "Tüm kullanıcıları senkronize etmeye zorla",
"OPTION_JUMP_TO_OTHERS": "Diğerlerine Atla",
"OPTION_JUMP_TO_ME": "Bana Atla",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Video oynatımına sıkıştırma gibi ses efektleri uygular",
"AUDIO_OPEN_SETTINGS": "Aç",
"NEW_FEATURE_AUDIO": "Yeni: Ses işleme — kompresörü deneyin!",
"NEW_FEATURE_THEME": "Yeni: Temalar — klasik görünüme veya minimal grafite geçin.",
"AUDIO_BACK": "← Geri",
"AUDIO_PAGE_TITLE": "Ses ayarları",
"AUDIO_MASTER_TOGGLE": "Ses işleme",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Sekme başlığını gönder",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Seçili tarayıcı sekmesinin başlığını odaya gönderir.",
"LABEL_MEDIA_TITLE_PRIVACY": "Medya başlığı",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Medya başlıklarının odaya nasıl gönderileceğini seçin."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Medya başlıklarının odaya nasıl gönderileceğini seçin.",
"LABEL_SETTINGS_GROUP_PROFILE": "Profil ve Görünüm",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Kullanıcı adınızı, temanızı ve dil tercihlerinizi değiştirin.",
"LABEL_SETTINGS_GROUP_SYNC": "Oynatma ve Eşitleme",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Oynatma, bildirim ve ses tercihlerini özelleştirin."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "Пульт дистанційного керування",
"BTN_COPY_INVITE": "📋 Посилання на запрошення",
"BTN_COPY_INVITE_TOOLTIP": "Копіювати посилання для запрошення",
"BTN_PLAY": "Відтворити",
"BTN_PLAY": "Відтворити",
"BTN_PLAY_TOOLTIP": "Надішліть усім команду Play",
"BTN_PAUSE": "Пауза",
"BTN_PAUSE": "Пауза",
"BTN_PAUSE_TOOLTIP": "Надішліть команду паузи всім",
"BTN_SYNC": "⚡ СИНХР",
"BTN_SYNC": "Синхр",
"BTN_SYNC_TOOLTIP": "Змусити всіх користувачів синхронізуватися",
"OPTION_JUMP_TO_OTHERS": "Перейти до інших",
"OPTION_JUMP_TO_ME": "Перейти до мене",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "Застосуйте звукові ефекти, такі як стиснення, до відтворення відео",
"AUDIO_OPEN_SETTINGS": "Відкрити",
"NEW_FEATURE_AUDIO": "Новинка: обробка звуку — спробуйте компресор!",
"NEW_FEATURE_THEME": "Нове: Теми — перемкніться на класичний вигляд або мінімальний графіт.",
"AUDIO_BACK": "← Назад",
"AUDIO_PAGE_TITLE": "Параметри звуку",
"AUDIO_MASTER_TOGGLE": "Обробка аудіо",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "Надсилати назву вкладки",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "Надсилає до кімнати назву вибраної вкладки браузера.",
"LABEL_MEDIA_TITLE_PRIVACY": "Назва медіа",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Виберіть, як назви медіа надсилати до кімнати."
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "Виберіть, як назви медіа надсилати до кімнати.",
"LABEL_SETTINGS_GROUP_PROFILE": "Профіль та Вигляд",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "Змініть ім'я користувача, тему та мовні налаштування.",
"LABEL_SETTINGS_GROUP_SYNC": "Відтворення та Синхронізація",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "Налаштуйте відтворення, сповіщення та параметри звуку."
}
+9 -4
View File
@@ -70,11 +70,11 @@
"LABEL_REMOTE_CONTROL": "遥控",
"BTN_COPY_INVITE": "📋 邀请链接",
"BTN_COPY_INVITE_TOOLTIP": "复制邀请链接",
"BTN_PLAY": "播放",
"BTN_PLAY": "播放",
"BTN_PLAY_TOOLTIP": "向所有人发送播放命令",
"BTN_PAUSE": "暂停",
"BTN_PAUSE": "暂停",
"BTN_PAUSE_TOOLTIP": "向所有人发送暂停命令",
"BTN_SYNC": "同步",
"BTN_SYNC": "同步",
"BTN_SYNC_TOOLTIP": "强制所有用户同步",
"OPTION_JUMP_TO_OTHERS": "跳转到其他",
"OPTION_JUMP_TO_ME": "跳到我这里",
@@ -209,6 +209,7 @@
"LABEL_AUDIO_PROCESSING_TOOLTIP": "将压缩等音频效果应用于视频播放",
"AUDIO_OPEN_SETTINGS": "打开",
"NEW_FEATURE_AUDIO": "新功能:音频处理 - 尝试压缩器!",
"NEW_FEATURE_THEME": "新功能:主题 — 切换到经典外观或极简石墨风格。",
"AUDIO_BACK": "← 返回",
"AUDIO_PAGE_TITLE": "音频设置",
"AUDIO_MASTER_TOGGLE": "音频处理",
@@ -238,5 +239,9 @@
"LABEL_SEND_TAB_TITLE": "发送标签页标题",
"LABEL_SEND_TAB_TITLE_TOOLTIP": "将所选浏览器标签页的标题发送到房间。",
"LABEL_MEDIA_TITLE_PRIVACY": "媒体标题",
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "选择媒体标题发送到房间的方式。"
"LABEL_MEDIA_TITLE_PRIVACY_TOOLTIP": "选择媒体标题发送到房间的方式。",
"LABEL_SETTINGS_GROUP_PROFILE": "个人资料与外观",
"LABEL_SETTINGS_GROUP_PROFILE_TOOLTIP": "更改您的用户名、主题和语言首选项。",
"LABEL_SETTINGS_GROUP_SYNC": "播放与同步",
"LABEL_SETTINGS_GROUP_SYNC_TOOLTIP": "自定义播放、通知和音频首选项。"
}
+1 -1
View File
@@ -2,7 +2,7 @@
"manifest_version": 3,
"default_locale": "en",
"name": "KoalaSync",
"version": "2.5.2",
"version": "2.5.4",
"description": "Synchronize video playback on YouTube, Netflix, Emby, Jellyfin, and any HTML5 site in real-time with friends.",
"permissions": [
"storage",
+1189 -196
View File
File diff suppressed because it is too large Load Diff
+266 -67
View File
@@ -64,6 +64,8 @@ const elements = {
autoCopyInvite: document.getElementById('autoCopyInvite'),
cancelLobbyBtn: document.getElementById('cancelLobbyBtn'),
langSelector: document.getElementById('langSelector'),
themeSelector: document.getElementById('themeSelector'),
paletteSelector: document.getElementById('paletteSelector'),
audioSettingsLink: document.getElementById('audioSettingsLink'),
settingsSupportLink: document.getElementById('settingsSupportLink'),
@@ -114,6 +116,12 @@ const FEATURE_HINTS = [
selector: '#audioProcessingLabel',
position: 'beforebegin',
i18nTooltip: 'NEW_FEATURE_AUDIO'
},
{
key: 'theme_picker',
selector: '#paletteLabel',
position: 'afterend',
i18nTooltip: 'NEW_FEATURE_THEME'
}
];
@@ -132,6 +140,118 @@ function openAudioSettingsPage() {
chrome.tabs.create({ url: chrome.runtime.getURL('audio-options.html') });
}
function localizeThemeSelector(locale) {
const labels = {
de: ['Darstellung', 'System', 'Dunkel', 'Hell', 'Folge dem System-Design oder wähle ein festes Design'],
fr: ['Apparence', 'Système', 'Sombre', 'Clair', 'Suivre le thème du système ou choisir une apparence fixe'],
es: ['Apariencia', 'Sistema', 'Oscuro', 'Claro', 'Seguir el tema del sistema o elegir una apariencia fija'],
it: ['Aspetto', 'Sistema', 'Scuro', 'Chiaro', 'Segui il tema di sistema o scegli un aspetto fisso'],
nl: ['Weergave', 'Systeem', 'Donker', 'Licht', 'Volg het systeemthema of kies een vaste weergave'],
pl: ['Wygląd', 'System', 'Ciemny', 'Jasny', 'Dostosuj do motywu systemowego lub wybierz stały wygląd'],
pt: ['Aparência', 'Sistema', 'Escuro', 'Claro', 'Seguir o tema do sistema ou escolher uma aparência fixa'],
'pt-BR': ['Aparência', 'Sistema', 'Escuro', 'Claro', 'Seguir o tema do sistema ou escolher uma aparência fixa'],
tr: ['Görünüm', 'Sistem', 'Koyu', 'Açık', 'Sistem temasını takip et veya sabit bir görünüm seç'],
ru: ['Оформление', 'Системная', 'Тёмная', 'Светлая', 'Следовать системной теме или выбрать фиксированное оформление'],
ja: ['外観', 'システム', 'ダーク', 'ライト', 'システムテーマに従うか、固定の外観を選択します'],
ko: ['테마', '시스템', '다크', '라이트', '시스템 테마를 따르거나 고정된 테마를 선택하세요'],
zh: ['外观', '跟随系统', '深色', '浅色', '跟随系统主题或选择固定外观'],
uk: ['Вигляд', 'Системна', 'Темна', 'Світла', 'Дотримуватися системної теми або вибрати фіксоване оформлення'],
en: ['Appearance', 'System', 'Dark', 'Light', 'Follow the system theme or choose a fixed appearance']
};
const [label, system, dark, light, tooltip] = labels[locale] || labels.en;
const labelEl = document.getElementById('themeLabel');
const systemEl = document.getElementById('themeOptionSystem');
const darkEl = document.getElementById('themeOptionDark');
const lightEl = document.getElementById('themeOptionLight');
const systemButton = document.getElementById('themeChoiceSystem');
const darkButton = document.getElementById('themeChoiceDark');
const lightButton = document.getElementById('themeChoiceLight');
if (labelEl) {
labelEl.textContent = label;
if (tooltip) labelEl.setAttribute('title', tooltip);
}
if (systemEl) systemEl.textContent = system;
if (darkEl) darkEl.textContent = dark;
if (lightEl) lightEl.textContent = light;
if (systemButton) systemButton.textContent = system;
if (darkButton) darkButton.textContent = dark;
if (lightButton) lightButton.textContent = light;
if (elements.themeSelector) elements.themeSelector.setAttribute('aria-label', label);
// The palette scheme names (Eucalyptus / Cyber / Graphite) are brand
// words kept verbatim; only the row label is localized.
const paletteLabels = {
de: ['Farbschema', 'Wähle ein kuratiertes Farbschema für die Erweiterung'],
fr: ['Thème', 'Choisissez une palette de couleurs personnalisée pour l\'extension'],
es: ['Tema', 'Elige una paleta de colores seleccionada para la extensión'],
it: ['Tema', 'Scegli una combinazione di colori curata per l\'estensione'],
nl: ['Thema', 'Kies een samengesteld kleurenschema voor de extensie'],
pl: ['Motyw', 'Wybierz dopasowany schemat kolorów dla rozszerzenia'],
pt: ['Tema', 'Escolha um esquema de cores personalizado para a extensão'],
'pt-BR': ['Tema', 'Escolha um esquema de cores personalizado para a extensão'],
tr: ['Tema', 'Uzantı için özel olarak seçilmiş bir renk şeması seçin'],
ru: ['Тема', 'Выберите цветовую схему для расширения'],
ja: ['テーマ', '拡張機能の厳選された配色を選択します'],
ko: ['테마', '확장 프로그램에 맞는 특별한 색상 테마를 선택하세요'],
zh: ['主题', '为扩展程序选择精心设计的配色方案'],
uk: ['Тема', 'Виберіть колірну схему для розширення'],
en: ['Theme', 'Pick a curated colour scheme for the extension']
};
const [paletteLabel, paletteTooltip] = paletteLabels[locale] || paletteLabels.en;
const paletteLabelEl = document.getElementById('paletteLabel');
if (paletteLabelEl) {
paletteLabelEl.textContent = paletteLabel;
if (paletteTooltip) paletteLabelEl.setAttribute('title', paletteTooltip);
}
if (elements.paletteSelector) elements.paletteSelector.setAttribute('aria-label', paletteLabel);
// Micro-descriptors under each swatch card: [nature, classic, minimal].
const paletteDescs = {
de: ['Natur', 'Klassik', 'Minimal'], fr: ['Nature', 'Classique', 'Minimal'],
es: ['Naturaleza', 'Clásico', 'Minimal'], it: ['Natura', 'Classico', 'Minimal'],
nl: ['Natuur', 'Klassiek', 'Minimaal'], pl: ['Natura', 'Klasyczny', 'Minimal'],
pt: ['Natureza', 'Clássico', 'Minimal'], 'pt-BR': ['Natureza', 'Clássico', 'Minimal'],
tr: ['Doğa', 'Klasik', 'Minimal'], ru: ['Природа', 'Классика', 'Минимал'],
ja: ['ネイチャー', 'クラシック', 'ミニマル'], ko: ['자연', '클래식', '미니멀'],
zh: ['自然', '经典', '极简'], uk: ['Природа', 'Класика', 'Мінімал'],
en: ['Nature', 'Classic', 'Minimal']
};
const [natureDesc, classicDesc, minimalDesc] = paletteDescs[locale] || paletteDescs.en;
const descMap = { eucalyptus: natureDesc, cyber: classicDesc, graphite: minimalDesc };
document.querySelectorAll('.palette-choice').forEach(btn => {
const desc = btn.querySelector('.palette-desc');
if (desc) desc.textContent = descMap[btn.dataset.paletteValue] || desc.textContent;
});
}
function syncThemePicker() {
const activeMode = elements.themeSelector?.value || 'system';
document.querySelectorAll('.theme-choice').forEach(button => {
const active = button.dataset.themeValue === activeMode;
button.classList.toggle('active', active);
button.setAttribute('aria-pressed', String(active));
});
}
function syncPalettePicker() {
const activePalette = elements.paletteSelector?.value || 'eucalyptus';
document.querySelectorAll('.palette-choice').forEach(button => {
const active = button.dataset.paletteValue === activePalette;
button.classList.toggle('active', active);
button.setAttribute('aria-pressed', String(active));
});
}
// Briefly enable global colour transitions so a theme/appearance switch
// cross-fades instead of snapping. Self-clearing; a no-op under reduced motion.
let themeAnimTimer = null;
function flashThemeTransition() {
const root = document.documentElement;
root.classList.add('theme-anim');
if (themeAnimTimer) clearTimeout(themeAnimTimer);
themeAnimTimer = setTimeout(() => root.classList.remove('theme-anim'), 300);
}
async function updateFeatureHints() {
const data = await chrome.storage.sync.get(['dismissedHints']);
const dismissed = Array.isArray(data.dismissedHints) ? data.dismissedHints : [];
@@ -204,7 +324,7 @@ function setRoomRefreshCooldown() {
async function init() {
// Local-only by design — settings and room credentials never come from
// storage.sync (only onboardingComplete + dismissedHints live there).
const localData = await chrome.storage.local.get(['serverUrl', 'useCustomServer', 'roomId', 'password', 'username', 'filterNoise', 'autoSyncNextEpisode', 'sendTabTitle', 'mediaTitlePrivacyMode', 'titlePrivacyMode', 'forceSyncMode', 'browserNotifications', 'autoCopyInvite', 'locale', 'audioSettings', 'activeTab']);
const localData = await chrome.storage.local.get(['serverUrl', 'useCustomServer', 'roomId', 'password', 'username', 'filterNoise', 'autoSyncNextEpisode', 'sendTabTitle', 'mediaTitlePrivacyMode', 'titlePrivacyMode', 'forceSyncMode', 'browserNotifications', 'autoCopyInvite', 'locale', 'audioSettings', 'activeTab', 'themeMode', 'themePalette']);
let activeLang = localData.locale;
if (!activeLang) {
@@ -214,8 +334,13 @@ async function init() {
await loadLocale(activeLang);
translateDOM();
localizeThemeSelector(activeLang);
if (elements.langSelector) elements.langSelector.value = activeLang;
if (elements.themeSelector) elements.themeSelector.value = ['dark', 'light'].includes(localData.themeMode) ? localData.themeMode : 'system';
if (elements.paletteSelector) elements.paletteSelector.value = ['cyber', 'graphite'].includes(localData.themePalette) ? localData.themePalette : 'eucalyptus';
syncThemePicker();
syncPalettePicker();
let username = localData.username;
if (!username) {
@@ -476,8 +601,8 @@ function updateLastActionUI(state, peers) {
const safeAcks = state.acks || [];
const actionNames = {
'play': getMessage('BTN_PLAY').replace('▶ ', '').toUpperCase(),
'pause': getMessage('BTN_PAUSE').replace('⏸ ', '').toUpperCase(),
'play': getMessage('BTN_PLAY'),
'pause': getMessage('BTN_PAUSE'),
'seek': getMessage('NOTIF_SEEK').toUpperCase(),
'force_sync_prepare': getMessage('BTN_STATE_SYNCING').toUpperCase(),
'force_sync_execute': getMessage('BTN_STATE_SYNCED').toUpperCase()
@@ -500,7 +625,7 @@ function updateLastActionUI(state, peers) {
actionSpan.textContent = actionNames[state.action] || state.action.toUpperCase();
const infoSpan = document.createElement('span');
infoSpan.style.cssText = 'font-size:9px; color:var(--text-muted);';
infoSpan.style.cssText = 'font-size:10px; color:var(--text-muted);';
infoSpan.textContent = `${senderName} @ ${timeStr}`;
header.appendChild(actionSpan);
@@ -509,14 +634,14 @@ function updateLastActionUI(state, peers) {
if (state.targetTime !== undefined && state.action === 'seek') {
const timeInfo = document.createElement('div');
timeInfo.style.cssText = 'font-size:9px; color:var(--text-muted); margin-top:4px;';
timeInfo.style.cssText = 'font-size:10px; color:var(--text-muted); margin-top:4px;';
timeInfo.textContent = `Target: ${formatTime(state.targetTime)}`;
elements.lastActionCard.appendChild(timeInfo);
}
if (state.targetTime !== undefined && state.action.includes('force_sync')) {
const timeInfo = document.createElement('div');
timeInfo.style.cssText = 'font-size:9px; color:var(--text-muted); margin-top:4px;';
timeInfo.style.cssText = 'font-size:10px; color:var(--text-muted); margin-top:4px;';
timeInfo.textContent = `Sync to: ${formatTime(state.targetTime)}`;
elements.lastActionCard.appendChild(timeInfo);
}
@@ -529,7 +654,7 @@ function updateLastActionUI(state, peers) {
if (pId === localPeerId) return;
const pName = (typeof peer === 'object' && peer.username) ? peer.username : pId.substring(0, 4);
const isAcked = safeAcks.includes(pId) || pId === state.senderId;
const color = isAcked ? 'var(--success)' : '#475569';
const color = isAcked ? 'var(--success)' : 'var(--border-strong)';
const icon = isAcked ? '✓' : '...';
const avatar = getAvatarForName(pName);
@@ -538,11 +663,11 @@ function updateLastActionUI(state, peers) {
peerItem.style.cssText = `display:flex; flex-direction:column; align-items:center; opacity: ${isAcked ? 1 : 0.6};`;
const dot = document.createElement('div');
dot.style.cssText = `width:18px; height:18px; border-radius:50%; background:${color}; color:white; display:flex; align-items:center; justify-content:center; font-size:9px; font-weight:bold; margin-bottom:1px;`;
dot.style.cssText = `width:18px; height:18px; border-radius:50%; background:${color}; color:${isAcked ? 'var(--text-on-green)' : 'var(--text-primary)'}; display:flex; align-items:center; justify-content:center; font-size:9px; font-weight:bold; margin-bottom:1px;`;
dot.textContent = icon;
const nameSpan = document.createElement('span');
nameSpan.style.cssText = 'font-size:7px; color:var(--text-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:36px;';
nameSpan.style.cssText = 'font-size:9px; color:var(--text-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:42px;';
nameSpan.textContent = `${avatar} ${pName}`;
peerItem.appendChild(dot);
@@ -630,7 +755,10 @@ function renderEmpty(container, type) {
copyBtn.title = getMessage('BTN_COPY_INVITE_TOOLTIP');
copyBtn.addEventListener('click', () => {
navigator.clipboard.writeText(elements.inviteLink.value)
.then(() => showToast(getMessage('TOAST_INVITE_COPIED'), 'success', 2000))
.then(() => {
showToast(getMessage('TOAST_INVITE_COPIED'), 'success', 2000);
spawnLeafBurst(copyBtn);
})
.catch(() => showToast(getMessage('TOAST_COPY_FAILED'), 'error'));
});
wrapper.appendChild(copyBtn);
@@ -676,7 +804,7 @@ function updatePeerList(peers) {
const peerItem = document.createElement('div');
peerItem.className = 'peer-item';
peerItem.style.cssText = 'position:relative; display:block; padding: 8px 0; border-bottom: 1px solid rgba(255,255,255,0.05);';
peerItem.style.cssText = 'position:relative; display:block; padding: 8px 0; border-bottom: 1px solid var(--border-soft);';
const header = document.createElement('div');
header.style.cssText = 'display:flex; justify-content:space-between; align-items:center; padding-right: 24px;';
@@ -686,7 +814,7 @@ function updatePeerList(peers) {
const avatar = getAvatarForName(pUsername || pId);
if (pUsername) {
const u = document.createElement('span');
u.style.cssText = 'font-weight:600; color:white; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 120px; display: inline-block;';
u.style.cssText = 'font-weight:600; color:var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 120px; display: inline-block;';
u.textContent = `${avatar} ${pUsername}`;
const i = document.createElement('span');
i.style.cssText = 'font-size:10px; opacity:0.6; font-style:italic; white-space: nowrap; flex-shrink: 0;';
@@ -725,7 +853,7 @@ function updatePeerList(peers) {
// Host Control Mode: show "Solo" badge for peers watching on their own.
if (typeof p === 'object' && p.desynced) {
const solo = document.createElement('span');
solo.style.cssText = 'font-size:10px; color:#fff; background:#b45309; padding:2px 6px; border-radius:6px; font-weight:600;';
solo.style.cssText = 'font-size:10px; color:var(--text-on-warm); background:var(--accent-terracotta); padding:2px 6px; border-radius:6px; font-weight:700;';
const soloText = getMessage('BADGE_DESYNCED') || 'Solo';
solo.textContent = soloText;
solo.title = getMessage('TOOLTIP_PEER_DESYNCED') || soloText;
@@ -742,7 +870,7 @@ function updatePeerList(peers) {
const isController = !isOwner && hcmControllers.includes(pId);
if (isOwner || isController) {
const roleBadge = document.createElement('span');
roleBadge.style.cssText = 'font-size:10px; color:#fff; background:var(--accent); padding:2px 6px; border-radius:6px; font-weight:600;';
roleBadge.style.cssText = 'font-size:10px; color:var(--text-on-green); background:var(--accent); padding:2px 6px; border-radius:6px; font-weight:700;';
roleBadge.textContent = isOwner ? (getMessage('BADGE_HOST') || 'Host') : (getMessage('BADGE_CONTROLLER') || 'Controller');
rightGroup.appendChild(roleBadge);
}
@@ -755,7 +883,7 @@ function updatePeerList(peers) {
btn.title = revoke ? (getMessage('BTN_REVOKE_CONTROL') || 'Revoke') : (getMessage('BTN_GIVE_CONTROL') || 'Give control');
btn.addEventListener('mouseenter', () => {
btn.style.background = revoke ? 'var(--text-muted)' : 'var(--accent)';
btn.style.color = '#fff';
btn.style.color = 'var(--text-on-green)';
});
btn.addEventListener('mouseleave', () => {
btn.style.background = 'transparent';
@@ -1011,25 +1139,8 @@ function applyConnectionStatus(status) {
const idle = status === 'idle';
if (elements.connDot) {
elements.connDot.className = 'status-dot ' + (connected ? 'status-online' : ((connecting || reconnecting) ? 'status-online' : 'status-offline'));
if (reconnecting) {
elements.connDot.style.background = '#f59e0b';
elements.connDot.style.boxShadow = '0 0 8px #f59e0b';
} else if (connecting) {
elements.connDot.style.background = '#fbbf24';
elements.connDot.style.boxShadow = '0 0 8px #fbbf24';
} else if (idle) {
// Neutral grey — ready, not failed.
elements.connDot.style.background = '#9ca3af';
elements.connDot.style.boxShadow = 'none';
} else if (!connected) {
elements.connDot.style.background = '#ef4444';
elements.connDot.style.boxShadow = 'none';
} else {
elements.connDot.style.background = '';
elements.connDot.style.boxShadow = '';
}
const dotStatus = connected ? 'status-online' : ((connecting || reconnecting) ? 'status-connecting' : (idle ? 'status-idle' : 'status-offline'));
elements.connDot.className = `status-dot ${dotStatus}`;
}
if (elements.connText) {
@@ -1066,16 +1177,16 @@ function updatePingDisplay(pingMs) {
if (!elements.connPing) return;
if (pingMs === null || pingMs === undefined || typeof pingMs !== 'number' || !Number.isFinite(pingMs)) {
elements.connPing.textContent = '';
elements.connPing.style.color = '';
elements.connPing.className = 'conn-ping';
return;
}
elements.connPing.textContent = `${Math.round(pingMs)}ms`;
if (pingMs < 50) {
elements.connPing.style.color = '#22c55e';
if (pingMs < 75) {
elements.connPing.className = 'conn-ping conn-ping-good';
} else if (pingMs < 150) {
elements.connPing.style.color = '#f59e0b';
elements.connPing.className = 'conn-ping conn-ping-warning';
} else {
elements.connPing.style.color = '#ef4444';
elements.connPing.className = 'conn-ping conn-ping-bad';
}
}
@@ -1093,10 +1204,10 @@ function updateHistory(history) {
const actionLabel = item.action.toUpperCase().replace('FORCE_SYNC_', '');
const entry = document.createElement('div');
entry.style.cssText = 'margin-bottom: 4px; border-bottom: 1px solid rgba(255,255,255,0.05); padding-bottom: 2px;';
entry.style.cssText = 'margin-bottom: 4px; border-bottom: 1px solid var(--border-soft); padding-bottom: 2px;';
const timeSpan = document.createElement('span');
timeSpan.style.color = '#64748b';
timeSpan.style.color = 'var(--text-muted)';
timeSpan.textContent = `[${time}] `;
const actionBold = document.createElement('b');
@@ -1139,7 +1250,7 @@ function updateRoomList(rooms) {
rooms.forEach(r => {
const item = document.createElement('div');
item.className = 'room-item';
item.style.cssText = 'display:flex; justify-content:space-between; align-items:center; padding: 8px; border-bottom: 1px solid rgba(255,255,255,0.05); cursor:pointer;';
item.style.cssText = 'display:flex; justify-content:space-between; align-items:center; padding: 8px; border-bottom: 1px solid var(--border-soft); cursor:pointer;';
item.dataset.id = r.id;
const leftSide = document.createElement('div');
@@ -1273,6 +1384,43 @@ if (elements.autoCopyInvite) {
});
}
if (elements.themeSelector) {
elements.themeSelector.addEventListener('change', () => {
const themeMode = elements.themeSelector.value;
flashThemeTransition();
window.koalaTheme?.setMode(themeMode);
chrome.storage.local.set({ themeMode });
syncThemePicker();
});
}
document.querySelectorAll('.theme-choice').forEach(button => {
button.addEventListener('click', () => {
if (!elements.themeSelector) return;
elements.themeSelector.value = button.dataset.themeValue;
elements.themeSelector.dispatchEvent(new window.Event('change'));
});
});
if (elements.paletteSelector) {
elements.paletteSelector.addEventListener('change', () => {
const themePalette = elements.paletteSelector.value;
flashThemeTransition();
window.koalaTheme?.setPalette(themePalette);
chrome.storage.local.set({ themePalette });
syncPalettePicker();
dismissFeatureHint('theme_picker');
});
}
document.querySelectorAll('.palette-choice').forEach(button => {
button.addEventListener('click', () => {
if (!elements.paletteSelector) return;
elements.paletteSelector.value = button.dataset.paletteValue;
elements.paletteSelector.dispatchEvent(new window.Event('change'));
});
});
if (elements.audioSettingsLink) {
elements.audioSettingsLink.addEventListener('click', async (event) => {
event.preventDefault();
@@ -1305,6 +1453,7 @@ if (elements.langSelector) {
await chrome.storage.local.set({ locale: selectedLang });
await loadLocale(selectedLang);
translateDOM();
localizeThemeSelector(selectedLang);
configureFooterLinks();
await updateFeatureHints();
@@ -1337,6 +1486,19 @@ if (elements.langSelector) {
});
}
// Accordion behavior for settings details categories (collapses others when one opens)
document.querySelectorAll('#tab-settings details.form-group').forEach(det => {
det.addEventListener('toggle', () => {
if (det.open) {
document.querySelectorAll('#tab-settings details.form-group').forEach(other => {
if (other !== det && other.open) {
other.removeAttribute('open');
}
});
}
});
});
elements.serverUrl.addEventListener('change', () => {
let url = elements.serverUrl.value.trim();
if (url && !url.includes('://')) {
@@ -1389,6 +1551,39 @@ function showToast(message, type = 'info', duration = 3000) {
setTimeout(() => toast.remove(), duration);
}
// Eucalyptus confetti: a few tiny leaves burst from the given element
// (matches the website's copy-invite moment). Subtle by design — few,
// tiny, short-lived — and skipped entirely under reduced motion.
function spawnLeafBurst(sourceEl) {
if (!sourceEl || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
const rect = sourceEl.getBoundingClientRect();
if (!rect.width) return;
const originY = rect.top + rect.height / 2;
const count = 4 + Math.floor(Math.random() * 3);
for (let i = 0; i < count; i++) {
const leaf = document.createElement('span');
// Three tones of the palette: deep green, sage, a dash of amber
const tone = Math.random();
leaf.className = 'click-leaf' + (tone < 0.25 ? ' click-leaf-amber' : tone < 0.55 ? ' click-leaf-sage' : '');
// Fan out upward to a burst peak spread across the button's width;
// the keyframes brake there and let each leaf sink while it rocks.
const angle = (-90 + (Math.random() - 0.5) * 150) * Math.PI / 180;
const dist = 18 + Math.random() * 24;
const dur = 0.85 + Math.random() * 0.4;
leaf.style.left = (rect.left + 4 + Math.random() * Math.max(1, rect.width - 8)) + 'px';
leaf.style.top = (originY - rect.height * 0.2) + 'px';
leaf.style.setProperty('--leaf-x', (Math.cos(angle) * dist).toFixed(1) + 'px');
leaf.style.setProperty('--leaf-y', (Math.sin(angle) * dist).toFixed(1) + 'px');
leaf.style.setProperty('--leaf-rot', ((Math.random() - 0.5) * 160).toFixed(0) + 'deg');
leaf.style.setProperty('--leaf-scale', (0.55 + Math.random() * 0.55).toFixed(2));
leaf.style.setProperty('--leaf-dur', dur.toFixed(2) + 's');
leaf.style.setProperty('--flutter-dur', (0.35 + Math.random() * 0.3).toFixed(2) + 's');
leaf.appendChild(document.createElement('i'));
document.body.appendChild(leaf);
setTimeout(() => leaf.remove(), dur * 1000 + 150);
}
}
function showError(msg) {
if (!elements.roomError) return;
const currentToken = ++errorToken;
@@ -1775,14 +1970,13 @@ elements.copyInvite.addEventListener('click', () => {
navigator.clipboard.writeText(elements.inviteLink.value).then(() => {
const original = elements.copyInvite.textContent;
elements.copyInvite.textContent = '✓';
elements.copyInvite.style.background = 'var(--success)';
elements.copyInvite.style.color = 'white';
elements.copyInvite.classList.add('copy-success');
showToast(getMessage('TOAST_INVITE_COPIED'), 'success', 2000);
spawnLeafBurst(elements.copyInvite);
setTimeout(() => {
elements.copyInvite.textContent = original;
elements.copyInvite.style.background = '';
elements.copyInvite.style.color = '';
}, 2000);
elements.copyInvite.classList.remove('copy-success');
}, 1500);
}).catch(() => {
showToast(getMessage('TOAST_COPY_FAILED'), 'error');
});
@@ -1792,13 +1986,14 @@ if (elements.syncTabCopyInvite) {
elements.syncTabCopyInvite.addEventListener('click', () => {
navigator.clipboard.writeText(elements.inviteLink.value).then(() => {
const original = elements.syncTabCopyInvite.textContent;
elements.syncTabCopyInvite.textContent = '✓';
elements.syncTabCopyInvite.style.color = 'var(--success)';
elements.syncTabCopyInvite.textContent = '✓ Copied';
elements.syncTabCopyInvite.classList.add('copy-success');
showToast(getMessage('TOAST_INVITE_COPIED'), 'success', 2000);
spawnLeafBurst(elements.syncTabCopyInvite);
setTimeout(() => {
elements.syncTabCopyInvite.textContent = original;
elements.syncTabCopyInvite.style.color = '';
}, 2000);
elements.syncTabCopyInvite.classList.remove('copy-success');
}, 1500);
});
});
}
@@ -2259,7 +2454,7 @@ function refreshDebugInfo() {
const addSection = (title) => {
const div = document.createElement('div');
div.style.cssText = 'margin: 8px 0 4px 0; border-bottom: 1px solid #334155; padding-bottom: 2px; color: var(--accent); font-weight: bold; font-size: 10px; text-transform: uppercase;';
div.style.cssText = 'margin: 8px 0 4px 0; border-bottom: 1px solid var(--border-soft); padding-bottom: 2px; color: var(--accent); font-weight: bold; font-size: 10px; text-transform: uppercase;';
div.textContent = title;
elements.videoDebug.appendChild(div);
};
@@ -2268,7 +2463,7 @@ function refreshDebugInfo() {
// No video found — show diagnostic info
addSection('Video Detection');
const notFound = document.createElement('div');
notFound.style.cssText = 'color: #ef4444; font-weight: 700; margin-bottom: 8px;';
notFound.style.cssText = 'color: var(--status-error-text); font-weight: 700; margin-bottom: 8px;';
notFound.textContent = 'NO VIDEO ELEMENT FOUND';
elements.videoDebug.appendChild(notFound);
@@ -2286,7 +2481,7 @@ function refreshDebugInfo() {
}
const hint = document.createElement('div');
hint.style.cssText = 'margin-top: 12px; padding: 8px; background: rgba(251,191,36,0.1); border-left: 3px solid #fbbf24; border-radius: 4px; font-size: 10px; color: var(--text-muted);';
hint.style.cssText = 'margin-top: 12px; padding: 8px; background: color-mix(in oklch, var(--warning), transparent 88%); border-left: 3px solid var(--warning); border-radius: 4px; font-size: 10px; color: var(--text);';
hint.textContent = 'Is a video currently playing? The extension only detects <video> elements. Ensure media is actively loaded on the page.';
elements.videoDebug.appendChild(hint);
return;
@@ -2294,12 +2489,12 @@ function refreshDebugInfo() {
// Video found — full debug
addSection('Playback');
addField('State', state.paused ? 'PAUSED' : 'PLAYING', state.paused ? 'var(--text-muted)' : '#22c55e');
addField('State', state.paused ? 'PAUSED' : 'PLAYING', state.paused ? 'var(--text-muted)' : 'var(--status-success-text)');
addField('Time', `${state.currentTime.toFixed(2)}s / ${(state.duration || 0).toFixed(2)}s`);
addField('ReadyState', `${state.readyState} (${state.readyStateLabel || '?'})`,
state.readyState >= 3 ? '#22c55e' : '#fbbf24');
state.readyState >= 3 ? 'var(--status-success-text)' : 'var(--status-warning-text)');
addField('Network', `${state.networkState} (${state.networkStateLabel || '?'})`,
state.networkState === 1 ? '#22c55e' : state.networkState === 3 ? '#ef4444' : 'var(--text-muted)');
state.networkState === 1 ? 'var(--status-success-text)' : state.networkState === 3 ? 'var(--status-error-text)' : 'var(--text-muted)');
addField('Buffered', state.buffered || '?');
if (state.nativeCurrentTime != null || state.nativeDuration != null) {
addField('Native Time', `${state.nativeCurrentTime ?? '?'}s / ${state.nativeDuration ?? '?'}s`);
@@ -2323,18 +2518,18 @@ function refreshDebugInfo() {
addSection('Dimensions');
const dimsOk = state.videoWidth > 0 && state.videoHeight > 0;
addField('Resolution', `${state.videoWidth}x${state.videoHeight}`, dimsOk ? '#22c55e' : '#ef4444');
addField('Resolution', `${state.videoWidth}x${state.videoHeight}`, dimsOk ? 'var(--status-success-text)' : 'var(--status-error-text)');
if (!dimsOk) {
const dimHint = document.createElement('div');
dimHint.style.cssText = 'color: #fbbf24; font-size: 9px; margin: 2px 0 6px 12px;';
dimHint.style.cssText = 'color: var(--status-warning-text); font-size: 10px; margin: 2px 0 6px 12px;';
dimHint.textContent = '0x0 = video element hidden or not yet loaded';
elements.videoDebug.appendChild(dimHint);
}
if (state.error) {
addSection('Media Error');
addField('Code', String(state.error.code), '#ef4444');
addField('Message', state.error.message || '?', '#ef4444');
addField('Code', String(state.error.code), 'var(--status-error-text)');
addField('Message', state.error.message || '?', 'var(--status-error-text)');
}
addSection('Detection');
@@ -2410,7 +2605,7 @@ function updateLobbyUI(lobby, peers) {
// Build peer readiness list
const readySet = new Set(lobby.readyPeers || []);
const peerLines = [];
const peerHtmls = [];
if (peers && peers.length > 0) {
peers.forEach(p => {
@@ -2418,14 +2613,15 @@ function updateLobbyUI(lobby, peers) {
const pName = (typeof p === 'object' && p.username) ? p.username : pId;
const avatar = getAvatarForName(pName);
const isReady = readySet.has(pId);
const icon = isReady ? '\u2705' : '\u23f3';
const icon = isReady ? '' : '';
const label = isReady ? getMessage('LABEL_LOBBY_PEER_READY') : getMessage('LABEL_LOBBY_PEER_LOADING');
peerLines.push(`${icon} ${avatar} ${pName} \u2014 ${label}`);
const badgeClass = isReady ? 'badge-ready' : 'badge-loading';
peerHtmls.push(`<span class="lobby-peer-item">${icon} ${avatar} ${pName} <span class="badge ${badgeClass}">${label}</span></span>`);
});
}
if (peerLines.length > 0 && elements.lobbyPeerStatus) {
elements.lobbyPeerStatus.textContent = peerLines.join(' | ');
if (peerHtmls.length > 0 && elements.lobbyPeerStatus) {
elements.lobbyPeerStatus.innerHTML = peerHtmls.join(' ');
} else if (elements.lobbyPeerStatus) {
elements.lobbyPeerStatus.textContent = getMessage('LOBBY_WAITING_PEERS');
}
@@ -2433,7 +2629,10 @@ function updateLobbyUI(lobby, peers) {
// Show elapsed time
if (lobby.createdAt && elements.lobbyPeerStatus) {
const elapsed = Math.floor((Date.now() - lobby.createdAt) / 1000);
elements.lobbyPeerStatus.textContent += ` (${elapsed}s)`;
const timerSpan = document.createElement('span');
timerSpan.style.cssText = 'font-size: 10px; color: var(--text-muted); margin-left: 6px; display: inline-block; vertical-align: middle;';
timerSpan.textContent = `(${elapsed}s)`;
elements.lobbyPeerStatus.appendChild(timerSpan);
}
}
+45
View File
@@ -0,0 +1,45 @@
(() => {
const systemTheme = window.matchMedia('(prefers-color-scheme: light)');
let mode = 'system';
let palette = 'eucalyptus';
const normalize = value => ['system', 'dark', 'light'].includes(value) ? value : 'system';
const normalizePalette = value => ['eucalyptus', 'cyber', 'graphite'].includes(value) ? value : 'eucalyptus';
const apply = value => {
mode = normalize(value);
const light = mode === 'light' || (mode === 'system' && systemTheme.matches);
document.documentElement.classList.toggle('theme-light', light);
document.documentElement.dataset.theme = light ? 'light' : 'dark';
document.documentElement.style.colorScheme = light ? 'light' : 'dark';
};
const applyPalette = value => {
palette = normalizePalette(value);
document.documentElement.dataset.palette = palette;
};
apply('system');
applyPalette('eucalyptus');
window.koalaTheme = {
getMode: () => mode,
setMode: apply,
getPalette: () => palette,
setPalette: applyPalette
};
systemTheme.addEventListener('change', () => {
if (mode === 'system') apply('system');
});
if (!globalThis.chrome?.storage?.local) return;
chrome.storage.local.get(['themeMode', 'themePalette'], data => {
apply(data.themeMode);
applyPalette(data.themePalette);
});
chrome.storage.onChanged.addListener((changes, area) => {
if (area !== 'local') return;
if (changes.themeMode) apply(changes.themeMode.newValue);
if (changes.themePalette) applyPalette(changes.themePalette.newValue);
});
})();
+1 -1
View File
@@ -19,7 +19,7 @@ export function normalizeSendTabTitle(sendTabTitle, legacyMode = TITLE_PRIVACY_M
export function normalizeTabTitle(title) {
if (typeof title !== 'string') return null;
const normalized = title.replace(/^\s*(?:\(\d{1,2}\)|\[\d{1,2}\])\s+/, '').trim();
const normalized = title.replace(/^\s*(?:\(\d+\+?\)|\[\d+\+?\])\s+/, '').trim();
return normalized.length > 0 ? normalized : null;
}
+492 -9
View File
@@ -1,23 +1,47 @@
{
"name": "koalasync",
"version": "2.5.1",
"version": "2.5.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "koalasync",
"version": "2.5.1",
"version": "2.5.4",
"devDependencies": {
"@playwright/test": "^1.61.1",
"@vitest/coverage-v8": "^4.1.9",
"archiver": "^7.0.1",
"esbuild": "^0.28.1",
"eslint": "^10.4.0",
"fs-extra": "^11.2.0",
"htmlnano": "^3.4.0",
"sharp": "^0.34.5",
"svgo": "^4.0.1",
"vitest": "^4.1.9"
}
},
"node_modules/@babel/code-frame": {
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
"integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.29.7",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/code-frame/node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@babel/helper-string-parser": {
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
@@ -79,9 +103,9 @@
}
},
"node_modules/@emnapi/core": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
"integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
"version": "1.11.2",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz",
"integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -91,9 +115,9 @@
}
},
"node_modules/@emnapi/runtime": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
"integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
"version": "1.11.2",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz",
"integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -1342,6 +1366,22 @@
"node": ">=14"
}
},
"node_modules/@playwright/test": {
"version": "1.61.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz",
"integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright": "1.61.1"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.4.tgz",
@@ -1565,6 +1605,29 @@
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
"integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/wasi-threads": "1.2.2",
"tslib": "^2.4.0"
}
},
"node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
"integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.4.tgz",
@@ -1663,6 +1726,13 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/relateurl": {
"version": "0.2.33",
"resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.33.tgz",
"integrity": "sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==",
"dev": true,
"license": "MIT"
},
"node_modules/@vitest/coverage-v8": {
"version": "4.1.9",
"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.9.tgz",
@@ -1926,6 +1996,13 @@
"node": ">= 14"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true,
"license": "Python-2.0"
},
"node_modules/assertion-error": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
@@ -2148,6 +2225,16 @@
"node": ">=8.0.0"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/chai": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
@@ -2219,6 +2306,33 @@
"dev": true,
"license": "MIT"
},
"node_modules/cosmiconfig": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz",
"integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==",
"dev": true,
"license": "MIT",
"dependencies": {
"env-paths": "^2.2.1",
"import-fresh": "^3.3.0",
"js-yaml": "^4.1.0",
"parse-json": "^5.2.0"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/d-fischer"
},
"peerDependencies": {
"typescript": ">=4.9.5"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/crc-32": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
@@ -2462,6 +2576,26 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/env-paths": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/error-ex": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
"integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
}
},
"node_modules/es-module-lexer": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.2.0.tgz",
@@ -2970,6 +3104,158 @@
"dev": true,
"license": "MIT"
},
"node_modules/htmlnano": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-3.4.0.tgz",
"integrity": "sha512-5rgW9c/830dlDiWLlsT3ZLBs52UAupymGwkwr4rn2yyuzrNY0RZwgr6F4q2AkUqrRuuHb3kPelqYsUgtzQDtQw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/relateurl": "^0.2.33",
"commander": "^15.0.0",
"cosmiconfig": "^9.0.0",
"posthtml": "^0.16.5",
"tinyglobby": "^0.2.17"
},
"bin": {
"htmlnano": "dist/bin.js"
},
"peerDependencies": {
"cssnano": "^7.0.0 || ^8.0.0",
"postcss": "^8.3.11",
"purgecss": "^8.0.0",
"relateurl": "^0.2.7",
"srcset": "^5.0.1",
"svgo": "^4.0.0",
"terser": "^5.21.0",
"uncss": "^0.17.3"
},
"peerDependenciesMeta": {
"cssnano": {
"optional": true
},
"postcss": {
"optional": true
},
"purgecss": {
"optional": true
},
"relateurl": {
"optional": true
},
"srcset": {
"optional": true
},
"svgo": {
"optional": true
},
"terser": {
"optional": true
},
"uncss": {
"optional": true
}
}
},
"node_modules/htmlnano/node_modules/commander": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz",
"integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=22.12.0"
}
},
"node_modules/htmlparser2": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
"integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
"dev": true,
"funding": [
"https://github.com/fb55/htmlparser2?sponsor=1",
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
],
"license": "MIT",
"dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.2",
"domutils": "^2.8.0",
"entities": "^3.0.1"
}
},
"node_modules/htmlparser2/node_modules/dom-serializer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
"integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
"dev": true,
"license": "MIT",
"dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
"entities": "^2.0.0"
},
"funding": {
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
"node_modules/htmlparser2/node_modules/dom-serializer/node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"dev": true,
"license": "BSD-2-Clause",
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/htmlparser2/node_modules/domhandler": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
"integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"domelementtype": "^2.2.0"
},
"engines": {
"node": ">= 4"
},
"funding": {
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/htmlparser2/node_modules/domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
"domhandler": "^4.2.0"
},
"funding": {
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/htmlparser2/node_modules/entities": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
"integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -3001,6 +3287,23 @@
"node": ">= 4"
}
},
"node_modules/import-fresh": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -3018,6 +3321,13 @@
"dev": true,
"license": "ISC"
},
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"dev": true,
"license": "MIT"
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -3051,6 +3361,13 @@
"node": ">=0.10.0"
}
},
"node_modules/is-json": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz",
"integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==",
"dev": true,
"license": "ISC"
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
@@ -3140,6 +3457,29 @@
"dev": true,
"license": "MIT"
},
"node_modules/js-yaml": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
"integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/puzrin"
},
{
"type": "github",
"url": "https://github.com/sponsors/nodeca"
}
],
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -3147,6 +3487,13 @@
"dev": true,
"license": "MIT"
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true,
"license": "MIT"
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -3505,6 +3852,13 @@
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true,
"license": "MIT"
},
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -3733,6 +4087,38 @@
"dev": true,
"license": "BlueOak-1.0.0"
},
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"license": "MIT",
"dependencies": {
"callsites": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -3790,7 +4176,6 @@
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -3798,6 +4183,53 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/playwright": {
"version": "1.61.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz",
"integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright-core": "1.61.1"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"fsevents": "2.3.2"
}
},
"node_modules/playwright-core": {
"version": "1.61.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz",
"integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/playwright/node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/postcss": {
"version": "8.5.16",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz",
@@ -3827,6 +4259,46 @@
"node": "^10 || ^12 || >=14"
}
},
"node_modules/posthtml": {
"version": "0.16.7",
"resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.7.tgz",
"integrity": "sha512-7Hc+IvlQ7hlaIfQFZnxlRl0jnpWq2qwibORBhQYIb0QbNtuicc5ZxvKkVT71HJ4Py1wSZ/3VR1r8LfkCtoCzhw==",
"dev": true,
"license": "MIT",
"dependencies": {
"posthtml-parser": "^0.11.0",
"posthtml-render": "^3.0.0"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/posthtml-parser": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz",
"integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==",
"dev": true,
"license": "MIT",
"dependencies": {
"htmlparser2": "^7.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/posthtml-render": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz",
"integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-json": "^2.0.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -3904,6 +4376,16 @@
"node": ">=10"
}
},
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/rolldown": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.4.tgz",
@@ -4239,6 +4721,7 @@
"integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"commander": "^11.1.0",
"css-select": "^5.1.0",
+5 -1
View File
@@ -1,23 +1,27 @@
{
"name": "koalasync",
"version": "2.5.2",
"version": "2.5.4",
"description": "KoalaSync Build Scripts",
"private": true,
"type": "module",
"scripts": {
"build:extension": "node scripts/build-extension.cjs",
"indexnow": "node website/submit-indexnow.cjs",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"subset-flags": "node website/tools/subset-flag-font.mjs",
"test": "npm run verify",
"test:unit": "vitest run",
"verify": "node scripts/verify-release.mjs"
},
"devDependencies": {
"@playwright/test": "^1.61.1",
"@vitest/coverage-v8": "^4.1.9",
"archiver": "^7.0.1",
"esbuild": "^0.28.1",
"eslint": "^10.4.0",
"fs-extra": "^11.2.0",
"htmlnano": "^3.4.0",
"sharp": "^0.34.5",
"svgo": "^4.0.1",
"vitest": "^4.1.9"
+78 -18
View File
@@ -1,33 +1,93 @@
# Development Scripts
This directory contains utility scripts for the KoalaSync development workflow.
This directory contains build, synchronization, and verification scripts for the KoalaSync workspace. Run all commands from the repository root unless a script says otherwise.
## Main Commands
```bash
npm run build:extension
npm run verify
npm run lint
npm run test:unit
```
- `npm run build:extension` runs `scripts/build-extension.cjs`.
- `npm run verify` runs the full release-safety suite in `scripts/verify-release.mjs`.
- `npm run lint` runs ESLint across the repository.
- `npm run test:unit` runs Vitest tests.
## build-extension.cjs
The primary build tool for KoalaSync. This Node.js script automates two critical tasks:
The primary extension build tool performs these steps:
1. **Protocol Synchronization**: Copies the "Single Source of Truth" constants (`shared/constants.js`) and the domain blacklist (`shared/blacklist.js`) from the root `/shared` directory into the `extension/shared/` directory.
2. **Content Script Injection**: Injects protocol constants directly into `content.js` using marker-based replacement. This is necessary because `content.js` executes synchronously and cannot use ES module imports.
3. **Artifact Generation**: Compiles the extension into browser-specific bundles for Chrome and Firefox, located in the `dist/` directory.
### Usage
From the **repository root**, run:
1. Recreates `dist/`.
2. Copies `shared/constants.js`, `shared/blacklist.js`, `shared/names.js`, and `shared/README.md` into `extension/shared/`.
3. Injects synchronous shared values into `content.js`.
4. Injects browser-specific uninstall URL constants into `background.js`.
5. Injects the build timestamp into `popup.html`.
6. Generates browser-specific manifests for Chrome and Firefox.
7. Creates `dist/koalasync-chrome.zip` and `dist/koalasync-firefox.zip`.
Usage:
```bash
node scripts/build-extension.cjs
# or
npm run build:extension
```
### Why this script exists
KoalaSync uses **Vanilla JS** in the extension to maintain zero runtime dependencies and maximum privacy. Since we don't use a bundler (like Webpack or Vite) inside the extension, this script serves as our lightweight "pre-build" step to ensure that the protocol constants remain synchronized between the extension and the relay server.
## Injection Markers
### Content Injection Markers
The build script uses marker comments/placeholders. Missing markers are a hard build failure so release artifacts cannot silently contain stale protocol data.
The build script uses marker comments in `content.js` to locate and replace constant blocks:
| Target | Marker / Placeholder | Injected Value | Source |
|:---|:---|:---|:---|
| `content.js` | `SHARED_EVENTS_INJECT_START` / `END` | Full `EVENTS` object | `shared/constants.js` |
| `content.js` | `SHARED_HEARTBEAT_INJECT_START` / `END` | `HEARTBEAT_INTERVAL` | `shared/constants.js` |
| `content.js` | `SHARED_EPISODE_UTILS_INJECT_START` / `END` | `extractEpisodeId()` and `sameEpisode()` | `extension/episode-utils.js` |
| `background.js` | `UNINSTALL_URL_INJECT_START` / `END` | Uninstall URL and browser type | `scripts/build-extension.cjs` |
| `popup.html` | `__BUILD_TIMESTAMP__` | UTC build timestamp | Build time |
| Marker Pair | Injected Value | Source |
|:---|:---|:---|
| `SHARED_EVENTS_INJECT_START` / `END` | The full `EVENTS` object | `shared/constants.js` |
| `SHARED_HEARTBEAT_INJECT_START` / `END` | `HEARTBEAT_INTERVAL` value | `shared/constants.js` |
Do not remove or rename these markers without updating the build script and tests.
> **⚠️ Do NOT remove or modify these marker comments in `content.js`.** They are required for the build script to function. If the markers are missing, the build will fail with a clear error message.
## Verification Suite
`scripts/verify-release.mjs` is the best single command before release, PR review, or handoff:
```bash
npm run verify
```
It currently runs:
- Vitest unit tests.
- Server ops, route, WebSocket, and rate-limiter checks.
- Episode parser, title privacy, audio settings, popup cooldown, names, and content-video-finder checks.
- JavaScript syntax checks for server and extension entry points.
- Extension and website locale coverage checks.
- ESLint.
- Production `npm audit` checks for root and server dependencies.
- Extension build and website build.
## Focused Scripts
| Script | Purpose |
|:---|:---|
| `test-server-ops.mjs` | Health payload and admin metrics helpers |
| `test-server-routes.mjs` | HTTP health routes, caching, and admin metrics access |
| `test-server-ws.mjs` | Socket.IO relay integration, including host-control behavior |
| `test-rate-limiter.mjs` | Rate-limiter map and cooldown behavior |
| `test-episode-utils.mjs` | Episode-title extraction and comparison |
| `test-title-privacy.mjs` | Tab/media title privacy sanitization |
| `test-audio-settings.mjs` | Audio settings defaults and normalization |
| `test-popup-refresh-cooldown.mjs` | Popup refresh throttling behavior |
| `test-names.mjs` | Generated username format and coverage |
| `test-content-video-finder.cjs` | Content-script video selection helpers |
| `test-locales.cjs` | Extension runtime and browser-store locale coverage |
| `test-website-locales.mjs` | Website locale coverage |
## Do Not Break
- Keep scripts runnable from the repository root.
- Keep build output under `dist/` and generated website output under `website/www/`.
- Keep shared protocol sync automated; do not add manual copy steps.
- Treat warnings in verification scripts as release blockers unless the script explicitly documents them as informational.
+22 -27
View File
@@ -36,6 +36,13 @@ console.log('✓ constants.js, blacklist.js, names.js, and README.md synced to e
// Read the base manifest
const baseManifest = JSON.parse(fs.readFileSync(baseManifestPath, 'utf8'));
function replaceRequiredBlock(content, pattern, replacement, description) {
if (!pattern.test(content)) {
throw new Error(`CRITICAL: ${description} markers not found. Aborting build to prevent stale artifacts.`);
}
return content.replace(pattern, replacement);
}
// Helper to copy files, ignoring manifest.json and manifest.base.json
// Also injects shared constants into content.js
function copyExtensionFiles(targetDir, browserName) {
@@ -79,11 +86,7 @@ function copyExtensionFiles(targetDir, browserName) {
const ePattern = new RegExp(`${eStart}[\\s\\S]+?${eEnd}`);
const eRep = `${eStart}\n // This block is automatically updated by /scripts/build-extension.cjs\n const EVENTS = ${eventsObject};\n ${eEnd}`;
if (ePattern.test(content)) {
content = content.replace(ePattern, eRep);
} else {
console.warn('⚠️ WARNING: Event markers not found in content.js');
}
content = replaceRequiredBlock(content, ePattern, eRep, 'Event injection');
// 2. Inject Heartbeat
const hStart = '// --- SHARED_HEARTBEAT_INJECT_START ---';
@@ -91,30 +94,23 @@ function copyExtensionFiles(targetDir, browserName) {
const hPattern = new RegExp(`${hStart}[\\s\\S]+?${hEnd}`);
const hRep = `${hStart}\n const HEARTBEAT_INTERVAL_VAL = ${heartbeatVal};\n ${hEnd}`;
if (hPattern.test(content)) {
content = content.replace(hPattern, hRep);
} else {
console.warn('⚠️ WARNING: Heartbeat markers not found in content.js');
}
content = replaceRequiredBlock(content, hPattern, hRep, 'Heartbeat injection');
// 3. Inject Episode Utils
const euStart = '// --- SHARED_EPISODE_UTILS_INJECT_START ---';
const euEnd = '// --- SHARED_EPISODE_UTILS_INJECT_END ---';
const euPattern = new RegExp(euStart.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '[\\s\\S]+?' + euEnd.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
const euPath = path.join(rootDir, 'extension', 'episode-utils.js');
if (fs.existsSync(euPath)) {
const euContent = fs.readFileSync(euPath, 'utf8');
const stripped = euContent
.replace(/^\/\*\*[\s\S]*?\*\/\s*/m, '')
.replace(/export function /g, 'function ')
.trim();
const euRep = `${euStart}\n // This block is automatically updated by /scripts/build-extension.cjs\n${stripped.split('\n').map(l => ' ' + l).join('\n')}\n ${euEnd}`;
if (euPattern.test(content)) {
content = content.replace(euPattern, euRep);
} else {
console.warn('⚠ WARNING: Episode utils markers not found in content.js');
}
if (!fs.existsSync(euPath)) {
throw new Error(`CRITICAL: Episode utils source missing: ${euPath}. Aborting build.`);
}
const euContent = fs.readFileSync(euPath, 'utf8');
const stripped = euContent
.replace(/^\/\*\*[\s\S]*?\*\/\s*/m, '')
.replace(/export function /g, 'function ')
.trim();
const euRep = `${euStart}\n // This block is automatically updated by /scripts/build-extension.cjs\n${stripped.split('\n').map(l => ' ' + l).join('\n')}\n ${euEnd}`;
content = replaceRequiredBlock(content, euPattern, euRep, 'Episode utils injection');
fs.writeFileSync(destPath, content);
console.log('✓ Injected shared constants into content.js');
@@ -132,17 +128,16 @@ function copyExtensionFiles(targetDir, browserName) {
uRep += ` const BROWSER_TYPE = "${browserName}";\n`;
uRep += ` ${uEnd}`;
if (uPattern.test(content)) {
content = content.replace(uPattern, uRep);
} else {
console.warn('⚠️ WARNING: Uninstall URL markers not found in background.js');
}
content = replaceRequiredBlock(content, uPattern, uRep, 'Uninstall URL injection');
fs.writeFileSync(destPath, content);
console.log(`✓ Injected uninstall URL constants for ${browserName} into background.js`);
} else if (item === 'popup.html') {
let content = fs.readFileSync(srcPath, 'utf8');
const timestamp = new Date().toISOString().replace('T', ' ').substring(0, 19) + ' UTC';
if (!content.includes('__BUILD_TIMESTAMP__')) {
throw new Error('CRITICAL: Build timestamp placeholder not found in popup.html. Aborting build.');
}
content = content.replace(/__BUILD_TIMESTAMP__/g, timestamp);
fs.writeFileSync(destPath, content);
console.log(`✓ Injected build timestamp into popup.html: ${timestamp}`);
+6 -1
View File
@@ -18,7 +18,12 @@ assert.equal(normalizeSendTabTitle(true, TITLE_PRIVACY_MODES.HIDDEN), true);
assert.equal(normalizeSendTabTitle(false, TITLE_PRIVACY_MODES.FULL), false);
assert.equal(normalizeTabTitle('(12) Testvideo - YouTube'), 'Testvideo - YouTube');
assert.equal(normalizeTabTitle('[7] Testvideo - YouTube'), 'Testvideo - YouTube');
assert.equal(normalizeTabTitle('(500) Days of Summer'), '(500) Days of Summer');
assert.equal(normalizeTabTitle('(99+) Testvideo - YouTube'), 'Testvideo - YouTube');
assert.equal(normalizeTabTitle('(999+) Testvideo - YouTube'), 'Testvideo - YouTube');
assert.equal(normalizeTabTitle('[999+] Testvideo - YouTube'), 'Testvideo - YouTube');
assert.equal(normalizeTabTitle('(500) Days of Summer'), 'Days of Summer');
assert.equal(normalizeTabTitle('(101) Days of Summer'), 'Days of Summer');
assert.equal(normalizeTabTitle('[101] Days of Summer'), 'Days of Summer');
assert.equal(normalizeTabTitle(' '), null);
assert.equal(sanitizeTabTitle('Private Tab', true), 'Private Tab');
+183
View File
@@ -0,0 +1,183 @@
#!/usr/bin/env node
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
const template = fs.readFileSync(path.join(repoRoot, 'website', 'template.html'), 'utf8');
const app = fs.readFileSync(path.join(repoRoot, 'website', 'app.js'), 'utf8');
const langInit = fs.readFileSync(path.join(repoRoot, 'website', 'lang-init.js'), 'utf8');
const demoCss = fs.readFileSync(path.join(repoRoot, 'website', 'styles', 'demo.css'), 'utf8');
const landingPrimaryCss = fs.readFileSync(path.join(repoRoot, 'website', 'styles', 'landing-primary.css'), 'utf8');
const legalCss = fs.readFileSync(path.join(repoRoot, 'website', 'styles', 'legal.css'), 'utf8');
const joinPage = fs.readFileSync(path.join(repoRoot, 'website', 'join.html'), 'utf8');
const imprintPage = fs.readFileSync(path.join(repoRoot, 'website', 'imprint.html'), 'utf8');
const germanImprintPage = fs.readFileSync(path.join(repoRoot, 'website', 'impressum-de.html'), 'utf8');
const alternativesIndex = fs.readFileSync(path.join(repoRoot, 'website', 'alternatives', 'index.html'), 'utf8');
const alternativesCss = fs.readFileSync(path.join(repoRoot, 'website', 'styles', 'alternatives.css'), 'utf8');
const llmsText = fs.readFileSync(path.join(repoRoot, 'website', 'llms.txt'), 'utf8');
const mockupStart = template.indexOf('<div class="extension-mockup">');
const mockupEnd = template.indexOf('<div class="demo-invite-fly"', mockupStart);
if (mockupStart === -1 || mockupEnd === -1) {
throw new Error('Could not locate the extension mockup in website/template.html');
}
const mockup = template.slice(mockupStart, mockupEnd);
const themeSensitiveControls = [
['video selector', /<select[^>]+id="demo-video-select"[^>]+>/],
['sync target', /<div[^>]+class="mock-input"[^>]+title="Choose sync target"[^>]*>/],
['WebSocket status', /<span style="[^"]*flex:1;[^"]*">\s*\{\{MOCK_27\}\}/]
];
for (const [label, pattern] of themeSensitiveControls) {
const match = mockup.match(pattern);
if (!match) throw new Error(`Could not locate ${label} in the extension mockup`);
if (!/color:\s*var\(--text\)/.test(match[0])) {
throw new Error(`${label} must use var(--text) so it remains readable in both themes`);
}
}
const landingStylesheets = [...template.matchAll(/<link\b[^>]*\brel="stylesheet"[^>]*\bhref="\{\{ASSET_PATH\}\}landing[^">]*"[^>]*>/g)];
if (landingStylesheets.length !== 1) {
throw new Error(`Landing must load exactly one render-blocking stylesheet; found ${landingStylesheets.length}`);
}
const llmsLinks = [...template.matchAll(/<link\b[^>]*\brel="alternate"[^>]*\btype="text\/markdown"[^>]*\bhref="https:\/\/sync\.koalastuff\.net\/llms\.txt"[^>]*>/g)];
if (llmsLinks.length !== 1) {
throw new Error(`Landing head must link exactly one canonical llms.txt document; found ${llmsLinks.length}`);
}
const requiredLlmsSections = [
'## Quick fit assessment',
'## How it works',
'## Privacy and security',
'## Supported environments',
'## Install KoalaSync',
'## Technical information'
];
for (const section of requiredLlmsSections) {
if (!llmsText.includes(section)) throw new Error(`llms.txt is missing ${section}`);
}
if (/\bWebRTC\b|\bport 54000\b|peer-to-peer by design/i.test(llmsText)) {
throw new Error('llms.txt must describe the current WebSocket relay architecture without obsolete WebRTC or port claims');
}
const documentedRelayUrls = [...llmsText.matchAll(/`(wss:\/\/[^`\s]+)`/g)].map(([, value]) => new URL(value));
const hasCanonicalPublicRelay = documentedRelayUrls.some((url) => (
url.protocol === 'wss:' &&
url.hostname === 'syncserver.koalastuff.net' &&
url.port === '' &&
url.pathname === '/' &&
url.search === '' &&
url.hash === ''
));
if (!hasCanonicalPublicRelay || !llmsText.includes('internally on port 3000')) {
throw new Error('llms.txt must distinguish the public TLS relay URL from the internal self-hosting port');
}
const selfHostingStart = template.indexOf('<div id="pane-docker"');
const selfHostingEnd = template.indexOf('</section>', selfHostingStart);
if (selfHostingStart === -1 || selfHostingEnd === -1) {
throw new Error('Could not locate the self-hosting examples in website/template.html');
}
const selfHostingExamples = template.slice(selfHostingStart, selfHostingEnd);
const requiredSelfHostingValues = [
'SERVER_SALT:',
'REPLACE_WITH_OPENSSL_RAND_BASE64_32_OUTPUT',
'ADMIN_METRICS_TOKEN:',
'DEBUG_LOGGING:',
'127.0.0.1:3000:3000'
];
for (const value of requiredSelfHostingValues) {
if (!selfHostingExamples.includes(value)) {
throw new Error(`Website self-hosting compose example is missing ${value}`);
}
}
if ((selfHostingExamples.match(/localhost:3000/g) || []).length !== 2 || selfHostingExamples.includes('KoalaSync:3000')) {
throw new Error('Both Caddy examples must match the compose loopback port binding');
}
const landingStylesheet = landingStylesheets[0][0];
if (!/href="\{\{ASSET_PATH\}\}landing\.min\.css"/.test(landingStylesheet)) {
throw new Error('Landing stylesheet must use the landing.min.css build placeholder');
}
if (/\bmedia=|data-(?:landing-)?deferred/.test(landingStylesheet)) {
throw new Error('Landing stylesheet must not be activated after first paint');
}
const runtimeCssActivation = [
['app.js', app],
['lang-init.js', langInit]
];
for (const [file, source] of runtimeCssActivation) {
if (/createElement\(['"]link['"]\)|requestIdleCallback|data-landing-deferred|data-deferred-css|\.media\s*=\s*['"]all['"]/.test(source)) {
throw new Error(`${file} must not dynamically load or activate structural CSS`);
}
}
// Film birds were removed entirely (commit 16cb138); guard against remnants
if (/film-hero-bird|film-bird-wing|film-birds/.test(template) || /filmBirdGlide|filmWingFlap/.test(demoCss)) {
throw new Error('Film birds were removed from the demo mockups; no bird markup or animations may remain');
}
const gettingStartedLightSurfaces = [
'step-illustration-1',
'step-illustration-2',
'step-illustration-3',
'illus-popup-card',
'illus-player-card',
'popup-select-mock'
];
for (const className of gettingStartedLightSurfaces) {
const pattern = new RegExp(`html\\.theme-light[^{]*\\.${className}[^}]*\\{`);
if (!pattern.test(landingPrimaryCss)) {
throw new Error(`Getting Started .${className} must define an explicit light-theme surface`);
}
}
const stepNumberLightRule = landingPrimaryCss.match(/html\.theme-light \.step-num\s*\{([^}]*)\}/)?.[1] || '';
if (!/color:\s*oklch\(/.test(stepNumberLightRule)
|| !/background:\s*none/.test(stepNumberLightRule)
|| !/-webkit-text-fill-color:\s*currentColor/.test(stepNumberLightRule)) {
throw new Error('Getting Started step numbers must use solid readable text in light mode');
}
if (!/class="footer-disclaimer"/.test(joinPage) || /footer-disclaimer[^>]*opacity:/.test(joinPage)) {
throw new Error('Join-page disclaimer must use the contrast-safe footer-disclaimer colors without opacity');
}
if (!/\.legal-inline-link\s*\{[^}]*text-decoration:\s*underline/s.test(legalCss)) {
throw new Error('Legal prose links must use a non-color underline cue');
}
for (const [name, page] of [['imprint.html', imprintPage], ['impressum-de.html', germanImprintPage]]) {
if ((page.match(/class="legal-inline-link"/g) || []).length !== 3) {
throw new Error(`${name} must mark all three prose links as legal-inline-link`);
}
if ((page.match(/class="legal-inline-label"/g) || []).length !== 2 || /opacity:\s*0\.6/.test(page)) {
throw new Error(`${name} contact labels must use full-opacity theme text`);
}
}
if (/<h3\b/.test(alternativesIndex)
|| (alternativesIndex.match(/<h2\b/g) || []).length !== 6
|| (alternativesIndex.match(/<h2[^>]+color:\s*var\(--text\)/g) || []).length !== 6) {
throw new Error('Alternatives overview cards must use h2 headings directly below the page h1');
}
if (!/html\.theme-light \.guide-card\s*\{[^}]*background-color:\s*var\(--card-surface\)\s*!important/s.test(alternativesCss)) {
throw new Error('Alternatives cards must define a readable light-theme surface');
}
const reducedMotionRule = demoCss.match(/@media \(prefers-reduced-motion: reduce\)\s*\{\s*\.step-illustration-3 \.film-mtn-scroll,\s*\.step-illustration-3 \.film-mid-scroll,\s*\.step-illustration-3 \.film-fore-scroll\s*\{([^}]*)\}/)?.[1] || '';
if (!/animation:\s*none\s*!important/.test(reducedMotionRule)) {
throw new Error('Getting Started film layers must stop when reduced motion is requested');
}
console.log('Extension mockup theme-sensitive text uses theme-aware colors');
console.log('Landing CSS is render-blocking, single-request, and cascade-stable');
console.log('Landing head discovers a complete and architecture-accurate llms.txt');
console.log('Website self-hosting examples include production secrets and consistent networking');
console.log('Foreground film birds use complete, always-on wing and glide animations');
console.log('All Getting Started mockups define explicit light-theme surfaces');
console.log('Getting Started step numbers stay readable in light mode');
console.log('Accessibility regressions stay fixed across legal, alternatives, and reduced-motion views');
+113
View File
@@ -0,0 +1,113 @@
/**
* KoalaSync Locale Translation Script
*
* This script is stored in `scripts/translate-locales-tool.cjs`
* so future LLM agents can easily reuse and adapt it to translate new keys.
*
* Usage:
* node scripts/translate-locales-tool.cjs
*/
const fs = require('fs');
const path = require('path');
const http = require('https');
const localesDir = path.join(__dirname, '../website/locales');
const enFile = path.join(localesDir, 'en.json');
const enLocale = JSON.parse(fs.readFileSync(enFile, 'utf8'));
// Keys starting with these prefixes need to be translated.
// Update this list when translating new pages or features.
const prefixes = ['ALT_W2G_', 'ALT_SCENER_', 'ALT_KOSMI_', 'ALT_TWOSEVEN_'];
const keysToTranslate = Object.keys(enLocale).filter(key => {
return prefixes.some(prefix => key.startsWith(prefix));
});
console.log(`Found ${keysToTranslate.length} keys to translate.`);
function translate(text, targetLang) {
return new Promise((resolve, reject) => {
// We use Google's free translation endpoint which is highly robust for standard text segment translations
const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}`;
http.get(url, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
try {
const parsed = JSON.parse(data);
const translation = parsed[0].map(item => item[0]).join('');
resolve(translation);
} catch (_e) {
reject(new Error(`Failed to parse response for target ${targetLang}: ${data}`));
}
});
}).on('error', reject);
});
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
const fileToLangMap = {
'es.json': 'es',
'fr.json': 'fr',
'it.json': 'it',
'ja.json': 'ja',
'ko.json': 'ko',
'nl.json': 'nl',
'pl.json': 'pl',
'pt-BR.json': 'pt',
'pt.json': 'pt',
'ru.json': 'ru',
'tr.json': 'tr',
'uk.json': 'uk',
'zh.json': 'zh-CN'
};
async function run() {
const files = fs.readdirSync(localesDir).filter(f => f.endsWith('.json') && f !== 'en.json' && f !== 'de.json');
for (const file of files) {
const targetLang = fileToLangMap[file];
if (!targetLang) {
console.log(`Skipping unknown file mapping: ${file}`);
continue;
}
const filePath = path.join(localesDir, file);
const content = JSON.parse(fs.readFileSync(filePath, 'utf8'));
console.log(`\nTranslating ${file} (${targetLang})...`);
let translatedCount = 0;
for (const key of keysToTranslate) {
const englishValue = enLocale[key];
// Translate if missing or currently identical to English value (which means it's a fallback)
if (!content[key] || content[key] === englishValue) {
try {
const translatedValue = await translate(englishValue, targetLang);
content[key] = translatedValue;
translatedCount++;
console.log(` [${translatedCount}/${keysToTranslate.length}] Translated key: ${key}`);
await sleep(200); // 200ms delay to prevent rate limits
} catch (err) {
console.error(` Error translating key ${key} to ${targetLang}:`, err.message);
// Wait longer on error
await sleep(2000);
}
}
}
// Save back keeping exact same structure and format
fs.writeFileSync(filePath, JSON.stringify(content, null, 2) + '\n', 'utf8');
console.log(`Saved ${file} (${translatedCount} keys updated).`);
}
console.log('\nAll translations completed successfully!');
}
run().catch(err => {
console.error('Translation script failed:', err);
});
+50
View File
@@ -0,0 +1,50 @@
const fs = require('fs');
const path = require('path');
const localesDir = path.join(__dirname, '../website/locales');
const files = fs.readdirSync(localesDir).filter(f => f.endsWith('.json') && f !== 'en.json');
const brandTranslations = [
'dos siete', 'dos-siete', 'deux sept', 'deux-sept', 'zwei sieben', 'zwei-sieben',
'due sette', 'due-sette', 'dwa siedem', 'dwa-siedem', 'twee zeven', 'twee-zeven',
'iki yedi', 'iki-yedi', 'два семь', 'два-семь', '二七', '二 七', '이칠', '이 칠',
'koala sync', 'koala-sync', 'watch 2 gether', 'watch-2-gether', 'watch 2gether',
'watch-2gether', 'jelly fin', 'jelly-fin'
];
let failed = false;
for (const file of files) {
const filePath = path.join(localesDir, file);
const content = JSON.parse(fs.readFileSync(filePath, 'utf8'));
for (const [key, value] of Object.entries(content)) {
if (typeof value !== 'string') continue;
// Check brand translations (case-insensitive)
const lowerValue = value.toLowerCase();
for (const pattern of brandTranslations) {
if (lowerValue.includes(pattern)) {
console.error(`Error in ${file} [key: ${key}]: Found translated brand pattern "${pattern}" in value: "${value}"`);
failed = true;
}
}
// Check tag validation
const tags = ['strong', 'em', 'span', 'b', 'i', 'p', 'a'];
for (const tag of tags) {
const openCount = (value.match(new RegExp(`<${tag}\\b[^>]*>`, 'g')) || []).length;
const closeCount = (value.match(new RegExp(`</${tag}\\b[^>]*>`, 'g')) || []).length;
if (openCount !== closeCount) {
console.error(`Error in ${file} [key: ${key}]: Unbalanced tag <${tag}> (open: ${openCount}, close: ${closeCount}) in value: "${value}"`);
failed = true;
}
}
}
}
if (!failed) {
console.log("All brand names and HTML tags are perfectly valid and intact across all languages!");
} else {
process.exit(1);
}
+1
View File
@@ -28,6 +28,7 @@ const checks = [
['background syntax', 'node', ['-c', 'extension/background.js']],
['locale coverage', 'node', ['scripts/test-locales.cjs']],
['website locale coverage', 'node', ['scripts/test-website-locales.mjs']],
['website theme coverage', 'node', ['scripts/test-website-theme.mjs']],
['lint', 'npm', ['run', 'lint']],
['root production audit', 'npm', ['audit', '--omit=dev']],
['server production audit', 'npm', ['audit', '--omit=dev'], { cwd: path.join(repoRoot, 'server') }],
+5
View File
@@ -2,6 +2,11 @@ PORT="3000"
MIN_VERSION="1.0.0"
MAX_ROOMS="1000"
MAX_PEERS_PER_ROOM="25"
# Required for production/self-hosting: unique random salt used for room-password hashes.
# Generate one with: openssl rand -base64 32
SERVER_SALT=""
# Optional: enables aggregate-only admin metrics on /health with Authorization: Bearer <token>
# Use a long random token, 32+ characters recommended.
ADMIN_METRICS_TOKEN=""
+27
View File
@@ -16,6 +16,11 @@ PORT="3000"
MAX_ROOMS="1000"
MAX_PEERS_PER_ROOM="25"
MIN_VERSION="1.0.0"
# Required for production/self-hosting: unique random salt used for room-password hashes.
# Generate one with: openssl rand -base64 32
SERVER_SALT=""
# Optional: enables aggregate-only admin metrics on /health with Authorization: Bearer <token>
# Use a long random token, 32+ characters recommended.
ADMIN_METRICS_TOKEN=""
@@ -24,6 +29,19 @@ ADMIN_METRICS_TOKEN=""
DEBUG_LOGGING="0"
```
### Room Password Salt
`SERVER_SALT` is used to HMAC room passwords before they are stored in RAM. The relay has a built-in fallback so development keeps working, but that fallback is public in the repository and the server logs a startup warning when it is used.
For every real self-hosted deployment, set a unique random value:
```bash
openssl rand -base64 32
```
Then add it to `server/.env` or your Compose environment:
```bash
SERVER_SALT=replace-with-a-long-random-salt
```
### Health & Metrics
`GET /` and `GET /health` are IP-rate-limited to 10 requests per minute per client IP. These health-style responses are cached server-side for 60 seconds and refreshed lazily on request. By default `/health` returns only basic service status, uptime, room count, connection count, and a timestamp.
@@ -63,11 +81,20 @@ npm install
npm start
```
### Verification
The server is covered by the root verification suite. From the repository root, run:
```bash
npm run verify
```
For focused server checks, see `scripts/test-server-ops.mjs`, `scripts/test-server-routes.mjs`, `scripts/test-server-ws.mjs`, and `scripts/test-rate-limiter.mjs`.
## Security
- **Rate Limiting**: IP-based connection limits and socket-based event limits.
- **Health Endpoint Throttle**: `GET /` and `GET /health` are limited to 10 requests per minute per IP, with 60-second lazy server-side response caching and stricter throttling for wrong admin bearer attempts.
- **Room Discovery Throttle**: Room-list refreshes are rate-limited server-side to one request every 10 seconds per socket.
- **Token Handshake**: Requires a valid token defined in the root `shared/constants.js`.
- **Password Hash Salt**: Set `SERVER_SALT` in every deployment so room-password hashes are not derived with the public fallback salt.
- **Single Source of Truth**: The server imports constants directly from the root `shared/` directory.
- **In-Memory**: Rooms are automatically pruned after 2 hours of inactivity.
- **Reverse Proxy Boundary**: The server trusts one reverse proxy hop for client IP detection. Keep the Node port private/firewalled so clients can only reach it through Caddy or another trusted proxy.
+61 -21
View File
@@ -1,33 +1,73 @@
# KoalaSync Shared Constants
This directory contains constants and protocol definitions used by both the extension and the server.
This directory is the source of truth for protocol constants and shared browser/server data.
## Where You Are
- `constants.js`: protocol version, app version, official URLs/token, event names, control modes, capabilities, and timing constants.
- `blacklist.js`: domains hidden by the popup's clutter filter.
- `names.js`: generated username parts and helper used by the extension.
- `extension/shared/`: generated mirror created by `npm run build:extension`; do not edit that mirror directly.
## Syncing with the Extension
> [!IMPORTANT]
> Every time this directory is modified, you must run `node scripts/build-extension.cjs` to keep the extension's copy up to date.
Because Browser Extensions (Manifest V3) cannot load files outside their root directory, all files in this directory must be copied to `extension/shared/` whenever they are modified. The build script handles this automatically.
> [!IMPORTANT]
> After modifying any file in this directory, run `npm run build:extension` from the repository root.
Browser extensions cannot import files outside their own root directory, so the build script copies shared files into `extension/shared/` and injects selected constants into `content.js`.
## Security & Versioning Constants
- `OFFICIAL_SERVER_TOKEN`: A 32-byte hex token required to connect to the official relay server.
- `APP_VERSION`: The current version of the extension. Automatically injected from the git tag during CI release builds.
- `OFFICIAL_SERVER_URL`: The default endpoint for the official KoalaSync relay.
- `PROTOCOL_VERSION`: exact protocol version required during `join_room`.
- `APP_VERSION`: extension/app version, injected from release tags by CI.
- `OFFICIAL_SERVER_URL`: default public relay endpoint.
- `OFFICIAL_LANDING_PAGE_URL`: public website and invitation bridge origin.
- `OFFICIAL_SERVER_TOKEN`: public client token used to reject non-KoalaSync Socket.IO clients. It is not a secret; see `docs/KNOWN_LIMITATIONS.md`.
- `SUPPORT_URL` and `GITHUB_URL`: public project links used by the extension UI.
## Control Modes & Capabilities
- `CONTROL_MODES.EVERYONE`: default room mode; any peer may control playback.
- `CONTROL_MODES.HOST_ONLY`: only the host and promoted controllers may move playback.
- `CAPABILITIES.HOST_CONTROL`: relay supports host-only room authority.
- `CAPABILITIES.CO_HOST`: relay supports promoted controller peers.
Clients should enable capability-gated UI only when the relay advertises the matching flag in `room_data.capabilities`.
## Protocol Events
For the complete and current event list, see the `EVENTS` object in [`constants.js`](constants.js). Key events include:
For the complete event list, read the `EVENTS` object in [`constants.js`](constants.js). Current event groups:
| Event | Direction | Purpose |
|:------|:----------|:--------|
| `JOIN_ROOM` | Client Server | Request to join a room with credentials |
| `LEAVE_ROOM` | Client Server | Leave the current room |
| `ROOM_DATA` | Server Client | Current room state (peers list) |
|:---|:---|:---|
| `JOIN_ROOM` | Client -> Server | Join or create a room with credentials and protocol version |
| `LEAVE_ROOM` | Client -> Server | Leave the current room |
| `ROOM_DATA` | Server -> Client | Initial room snapshot, peers, host state, capabilities |
| `ERROR` | Server -> Client | Connection, auth, capacity, or protocol error |
| `SET_CONTROL_MODE` | Client -> Server | Host switches between `everyone` and `host-only` |
| `CONTROL_MODE` | Server -> Client | Host/control-mode/controller snapshot changed |
| `SET_PEER_ROLE` | Client -> Server | Host promotes or demotes a co-host/controller |
| `PLAY` / `PAUSE` / `SEEK` | Bidirectional relay | Media control commands |
| `PEER_STATUS` | Bidirectional relay | Heartbeat or join/leave notification |
| `FORCE_SYNC_PREPARE` | Bidirectional relay | Phase 1: Pause & seek to target time |
| `FORCE_SYNC_ACK` | Bidirectional relay | Phase 1 confirmation: peer is buffered |
| `FORCE_SYNC_EXECUTE` | Bidirectional relay | Phase 2: Resume playback simultaneously |
| `EVENT_ACK` | Server Client | Delivery confirmation for UI feedback |
| `EPISODE_LOBBY` | Bidirectional relay | Episode transition: waiting for all peers |
| `EPISODE_READY` | Bidirectional relay | Episode confirmation: peer has loaded |
| `GET_ROOMS` / `ROOM_LIST` | Client ↔ Server | Room discovery |
| `ERROR` | Server → Client | Error message |
| `PEER_STATUS` | Bidirectional relay | Heartbeat and current media state |
| `FORCE_SYNC_PREPARE` | Bidirectional relay | Phase 1: pause and seek peers to a target time |
| `FORCE_SYNC_ACK` | Bidirectional relay | Phase 1 confirmation that a peer is ready |
| `FORCE_SYNC_EXECUTE` | Bidirectional relay | Phase 2: resume playback together |
| `EVENT_ACK` | Server -> Client | Delivery confirmation for UI feedback |
| `EPISODE_LOBBY` | Bidirectional relay | Episode transition lobby started |
| `EPISODE_READY` | Bidirectional relay | Peer has loaded the episode and is ready |
| `EPISODE_LOBBY_CANCEL` | Bidirectional relay | Active episode lobby cancelled |
| `GET_ROOMS` / `ROOM_LIST` | Client <-> Server | Room discovery with server-side cooldown |
| `PING` / `PONG` | Client <-> Server/Peer | Server RTT and peer latency checks |
## Timing Constants
- `HEARTBEAT_INTERVAL`: content heartbeat interval in milliseconds.
- `FORCE_SYNC_TIMEOUT`: max wait for force-sync ACKs.
- `EPISODE_LOBBY_TIMEOUT`: max wait for episode-lobby readiness.
## Do Not Break
- Do not rename events without updating `docs/PROTOCOL.md`, `server/index.js`, `extension/background.js`, and the build-injected `content.js` path.
- Do not edit `extension/shared/` directly.
- Keep new server-gated features behind `CAPABILITIES` so old clients and old relays degrade cleanly.
- Run `npm run build:extension` and `npm run verify` after protocol changes.
-5
View File
@@ -53,10 +53,6 @@ export const BLACKLIST_DOMAINS = [
'docs.google.com',
'sheets.google.com',
'slides.google.com',
'drive.google.com',
'dropbox.com',
'onedrive.live.com',
'icloud.com',
// Messengers
'web.whatsapp.com',
@@ -117,7 +113,6 @@ export const BLACKLIST_DOMAINS = [
'status.koalastuff.net',
'sync.koalastuff.net',
'timer.koalastuff.net',
'localhost',
'zoom.us',
'teams.microsoft.com',
'meet.google.com',
+1 -1
View File
@@ -7,7 +7,7 @@
*/
export const PROTOCOL_VERSION = "1.0.0";
export const APP_VERSION = "2.5.2";
export const APP_VERSION = "2.5.4";
export const OFFICIAL_SERVER_URL = 'wss://syncserver.koalastuff.net';
export const OFFICIAL_LANDING_PAGE_URL = 'https://sync.koalastuff.net';
+146
View File
@@ -0,0 +1,146 @@
<!DOCTYPE html>
<html lang="en" class="lang-en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>404 Page Not Found | KoalaSync</title>
<!-- Absolute asset paths: Caddy rewrites any missing URL (also nested ones
like /foo/bar) to this file, so relative paths would break. -->
<link rel="preload" href="/style.min.css" as="style">
<link rel="stylesheet" href="/style.min.css">
<link rel="icon" type="image/webp" href="/assets/NewLogoIcon_64.webp">
<meta name="description" content="This page could not be found.">
<meta name="robots" content="noindex, follow">
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#10190e">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="/lang-init.min.js"></script>
</head>
<body>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
<div class="container nav-content">
<a href="/" class="logo-area" style="text-decoration: none;">
<img src="/assets/NewLogoIcon_128.webp" alt="KoalaSync Logo" width="40" height="40">
<span>KoalaSync</span>
</a>
<div class="nav-links">
<a href="/" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="width: 16px; height: 16px; display: block;"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>
<span>Home</span>
</a>
<a href="https://github.com/Shik3i/KoalaSync" target="_blank" rel="noopener" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="16" height="16" aria-hidden="true" style="display: block;"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
GitHub
</a>
</div>
</div>
</nav>
<main class="legal-content">
<div class="legal-card" data-reveal style="padding: 2.5rem 2rem; text-align: center;">
<div style="display: flex; justify-content: center;">
<img src="/assets/KoalaSearching-180.webp" srcset="/assets/KoalaSearching-180.webp 180w, /assets/KoalaSearching-360.webp 360w" sizes="180px" alt="A cute koala looking through a telescope, searching for the missing page" class="legal-mascot" width="180" height="180">
</div>
<h1 style="margin-bottom: 0.5rem;">404</h1>
<p style="text-transform: uppercase; letter-spacing: 0.1em; font-size: 0.8rem; border-bottom: 1px solid var(--glass-border); padding-bottom: 1.5rem; margin-bottom: 1.5rem;">
Page not found
</p>
<p style="max-width: 34rem; margin: 0 auto;">
This page wandered off into the bamboo forest. Our koala is still looking for it — in the meantime, head back to safety.
</p>
<div style="display: flex; justify-content: center; gap: 1rem; margin-top: 2rem; flex-wrap: wrap;">
<a href="/" class="btn btn-primary">
Back to home
</a>
<a href="https://github.com/Shik3i/KoalaSync/issues" target="_blank" rel="noopener" class="btn btn-secondary">
Report a broken link
</a>
</div>
</div>
</main>
<footer>
<div class="container">
<p>&copy; 2026 KoalaSync. Open source under the MIT License.</p>
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="/imprint" style="color: var(--text-muted); text-decoration: none;">Legal Notice</a>
<a href="/privacy" style="color: var(--text-muted); text-decoration: none;">Privacy Policy</a>
</div>
</div>
</footer>
<script src="/app.min.js"></script>
</body>
</html>
@@ -0,0 +1 @@
4650678bb36b488d8f64343a67f1b931
+77 -41
View File
@@ -1,74 +1,110 @@
# KoalaSync Website & Invitation Bridge
This directory contains the KoalaSync website. It serves a dual purpose: it is both the **marketing landing page** and the **technical bridge** for joining synchronized rooms.
This directory contains the static KoalaSync website. It is both the public marketing/onboarding site and the browser-side invitation bridge for joining sync rooms.
## Where You Are
- `template.html`, `style.css`, `styles/*.css`, `app.js`, `lang-init.js`, and `locales/*.json` are source files. `style.css` is the local-development manifest; production concatenates the modules in the order declared by `website/build.cjs`.
- `build.cjs` compiles the static site into `website/www/`.
- `website/www/` is generated output. Do not edit files there directly.
- `join.html` handles room-invite links and communicates with the extension through `bridge.js`.
- `llms.txt` gives AI tools a detailed product profile and is linked from every localized landing-page `<head>`.
- `alternatives/` contains comparison pages for users evaluating KoalaSync against other watch-party approaches.
## Core Roles
### 1. Marketing & Onboarding
Provides a premium, multi-language (EN/DE/FR/ES/PT-BR/RU/IT/PL/TR/NL/JA/KO/PT) overview of features, setup instructions, and direct links to the extension stores.
### 2. The Invitation Bridge (`join.html`)
The website handles incoming invitation links. When a user clicks a link like `sync.koalastuff.net/join.html#join:roomID:pass`, the website:
- **Detects the Extension**: Verifies if KoalaSync is installed via the `bridge.js` content script.
- **Privacy-First Handshake**: The room credentials (ID/Password) are stored in the **URL Hash (#)**. This ensures the sensitive credentials **never reach the web server** and are processed entirely within the user's browser.
- **Auto-Join**: If the extension is detected, it automatically triggers the join flow without requiring user input.
The site explains KoalaSync, links to browser stores, documents self-hosting, and provides localized user-facing copy in 15 languages:
`en`, `de`, `fr`, `es`, `it`, `nl`, `pl`, `pt`, `pt-BR`, `tr`, `ru`, `ja`, `ko`, `zh`, and `uk`.
### 2. Invitation Bridge (`join.html`)
When a user opens an invitation such as `https://sync.koalastuff.net/join.html#join:roomID:pass`, the page:
- detects whether the KoalaSync extension is installed via the extension's `bridge.js` content script,
- keeps room credentials inside the URL hash so they are not sent to the web server,
- asks the extension to join the target room automatically when possible.
## Architecture
The website is 100% **Static HTML, CSS, and JS**.
- **Static i18n Compiler**: The site uses a lightweight, zero-dependency Node.js compiler (`build.cjs`) to parse dictionary files inside `/locales/` against a single source-of-truth template (`template.html`), outputting the fully deployable static folder to `/www/`.
- **Build-time Minification**: `build.cjs` automatically minifies CSS and JS during compilation using a built-in state-machine tokenizer (no npm dependencies). Source files are written unminified (`style.css`, `app.js`, `lang-init.js`) — always edit source files, never the generated `.min.*` files in `www/`.
- **Zero Backend**: No Node.js, PHP, or databases are required to host the compiled website.
- **Zero Tracking**: All assets (fonts, icons) are self-hosted to prevent third-party tracking.
- **Responsive**: Fully optimized for mobile with a native-feel hamburger menu.
The website is 100% static HTML, CSS, and JavaScript.
- **Static i18n compiler**: `build.cjs` combines `template.html` with dictionaries in `locales/`.
- **Build-time minification**: Source CSS/JS stays readable; generated output uses `.min.css` and `.min.js`.
- **Strangler CSS architecture**: `styles/*.css` supplies page-specific production bundles; `style.legacy.css` is the byte-identical, unloaded reference monolith. The landing bundle preserves the legacy cascade while excluding Join- and Alternatives-only rules. Structural CSS is not activated after paint because that causes layout shifts.
- **Zero backend**: The compiled site can be hosted by any static file server.
- **Zero external assets**: Fonts, icons, scripts, and images must remain self-hosted.
- **Generated SEO/runtime files**: `version.json`, `robots.txt`, `llms.txt`, clean URLs, localized pages, and minified assets are copied into `www/`; `sitemap.xml` is generated there from the current route set.
## Local Development & Compilation
From the repository root:
```bash
node website/build.cjs
npx serve -l 5000 website/www
```
Then open:
- `http://localhost:5000/` for the default page.
- `http://localhost:5000/de/` for a localized page.
- `http://localhost:5000/join.html#join:test-room:test-pass` to test the invitation bridge path.
Focused verification:
```bash
node scripts/test-website-locales.mjs
node scripts/test-website-theme.mjs
node --check website/app.js
node --check website/lang-init.js
```
Full verification:
```bash
npm run verify
```
## Hosting with Caddy
Caddy is the recommended web server. It provides automatic HTTPS and high-performance static file serving.
### Recommended Caddyfile
For a more comprehensive configuration that includes the Relay Server reverse proxy, see the root [Caddyfile.example](../examples/Caddyfile.example).
Caddy is the recommended production server because it handles HTTPS and static file serving cleanly. For a complete website plus relay reverse-proxy setup, use the root [Caddyfile.example](../examples/Caddyfile.example).
Minimal static-site block:
```caddy
sync.koalastuff.net {
root * /var/www/koalasync/website/www
try_files {path} {path}.html {path}/
file_server
encode zstd gzip
# Static Caching for high-performance PageSpeed (1 year with validation)
# Themed 404 page (Caddy returns an empty 404 without this)
handle_errors {
@notfound expression {err.status_code} == 404
rewrite @notfound /404.html
file_server
}
@static {
file
path *.ico *.css *.js *.png *.svg *.webp
path *.ico *.css *.js *.png *.svg *.webp *.avif
}
header @static Cache-Control "public, max-age=31536000, must-revalidate"
# Security Headers & Content Security Policy (CSP)
header {
# Strict Content Security Policy (restricts scripts and connections to self, forbids frames)
Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none';"
# Prevent FLoC tracking
Permissions-Policy interest-cohort=()
# Security best practices
Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'none';"
Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options nosniff
X-Frame-Options DENY
Referrer-Policy no-referrer-when-downgrade
X-Frame-Options SAMEORIGIN
Referrer-Policy strict-origin-when-cross-origin
}
}
```
## Local Development & Compilation
## Do Not Break
1. Run the compilation script from the repository root to generate the `/website/www` folder:
```bash
node website/build.cjs
```
2. Serve the compiled `/www` directory using any local development server:
```bash
npx serve website/www
```
3. To test the invitation flow locally, navigate to `http://localhost:5000/join.html#join:test-room:test-pass`.
> [!IMPORTANT]
> **Never edit files inside `website/www/` directly.** This directory is fully auto-generated by `build.cjs`. Always edit source files (`template.html`, `style.css`, `app.js`, `lang-init.js`, locale files in `locales/`) and re-run `node website/build.cjs` to apply changes. CSS and JS are output as `style.min.css`, `app.min.js`, and `lang-init.min.js` — the `.min.*` naming makes it visually obvious these are build artifacts. Editing minified files in `www/` will result in lost changes on the next build.
- Do not edit `website/www/` manually; rebuild it from sources.
- Do not add external CDNs, fonts, analytics, or third-party scripts.
- Keep invite credentials in the URL hash, not query parameters.
- Keep locale files synchronized with `website/build.cjs` and `scripts/test-website-locales.mjs`.
- `website/www/` is gitignored build output. Commit the source changes only; rebuild `www/` locally or in CI for verification and deployment.
+137 -19
View File
@@ -65,6 +65,23 @@
}
</script>
<!-- Structured Data (Schema.org) for WebPage -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "{{ALT_INDEX_TITLE}}",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives",
"description": "{{ALT_INDEX_META_DESC}}",
"inLanguage": "{{LANG_CODE}}",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
}
}
</script>
<!-- Organization Schema -->
<script type="application/ld+json">
{
@@ -81,17 +98,80 @@
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#0f172a">
<meta name="theme-color" content="#10190e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="{{ASSET_PATH}}lang-init.min.js"></script>
</head>
<body>
<div class="bg-blobs">
<div class="blob blob-1"></div>
<div class="blob blob-2"></div>
<div class="blob blob-3"></div>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
@@ -142,38 +222,76 @@
<img src="{{ASSET_PATH}}assets/RemoteProf.webp" alt="Koala teaching and explaining concepts" class="legal-mascot" width="180" height="180">
</div>
<h1>
<span lang="en">Guides &amp; Comparisons</span>
<span lang="de">Vergleiche &amp; Anleitungen</span>
</h1>
<h1>{{ALT_INDEX_HEADING}}</h1>
<p style="text-align: center; font-size: 0.95rem; line-height: 1.6; max-width: 600px; margin: 0 auto 2rem auto; color: var(--text-muted);">
<span lang="en">How does KoalaSync stack up against other watch party tools and streaming solutions? Read our honest, technical comparisons to find the best fit for your remote movie nights.</span>
<span lang="de">Wie schlägt sich KoalaSync im Vergleich zu anderen Watch-Party-Tools und Streaming-Lösungen? Lies unsere ehrlichen, technischen Vergleiche, um die passende Lösung für deine Filmabende zu finden.</span>
{{ALT_INDEX_INTRO}}
</p>
<!-- Cards Grid Layout -->
<div class="guides-grid" style="display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; margin-top: 2rem; margin-bottom: 2rem;">
<div class="guides-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1.5rem; margin-top: 2rem; margin-bottom: 2rem;">
<!-- Teleparty Card -->
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/teleparty" class="guide-card" style="text-decoration: none; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--glass-border); border-radius: 12px; padding: 1.5rem; display: flex; flex-direction: column; justify-content: space-between;">
<div>
<h3 style="margin-top: 0; margin-bottom: 0.75rem; color: #fff; font-size: 1.25rem;">{{ALT_TELEPARTY_TITLE}}</h3>
<h2 style="margin-top: 0; margin-bottom: 0.75rem; color: var(--text); font-size: 1.25rem;">{{ALT_TELEPARTY_TITLE}}</h2>
<p style="font-size: 0.9rem; line-height: 1.5; color: var(--text-muted); margin-bottom: 1.5rem;">{{ALT_TELEPARTY_META_DESC}}</p>
</div>
<div class="btn btn-primary" style="align-self: flex-start; padding: 0.5rem 1rem; font-size: 0.85rem; border-radius: 6px;">
<span lang="en">Read Comparison &rarr;</span>
<span lang="de">Vergleich lesen &rarr;</span>
{{ALT_INDEX_READ_COMPARISON}}
</div>
</a>
<!-- Watch2Gether Card -->
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/watch2gether" class="guide-card" style="text-decoration: none; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--glass-border); border-radius: 12px; padding: 1.5rem; display: flex; flex-direction: column; justify-content: space-between;">
<div>
<h2 style="margin-top: 0; margin-bottom: 0.75rem; color: var(--text); font-size: 1.25rem;">{{ALT_W2G_TITLE}}</h2>
<p style="font-size: 0.9rem; line-height: 1.5; color: var(--text-muted); margin-bottom: 1.5rem;">{{ALT_W2G_META_DESC}}</p>
</div>
<div class="btn btn-primary" style="align-self: flex-start; padding: 0.5rem 1rem; font-size: 0.85rem; border-radius: 6px;">
{{ALT_INDEX_READ_COMPARISON}}
</div>
</a>
<!-- Scener Card -->
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/scener" class="guide-card" style="text-decoration: none; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--glass-border); border-radius: 12px; padding: 1.5rem; display: flex; flex-direction: column; justify-content: space-between;">
<div>
<h2 style="margin-top: 0; margin-bottom: 0.75rem; color: var(--text); font-size: 1.25rem;">{{ALT_SCENER_TITLE}}</h2>
<p style="font-size: 0.9rem; line-height: 1.5; color: var(--text-muted); margin-bottom: 1.5rem;">{{ALT_SCENER_META_DESC}}</p>
</div>
<div class="btn btn-primary" style="align-self: flex-start; padding: 0.5rem 1rem; font-size: 0.85rem; border-radius: 6px;">
{{ALT_INDEX_READ_COMPARISON}}
</div>
</a>
<!-- Kosmi Card -->
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/kosmi" class="guide-card" style="text-decoration: none; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--glass-border); border-radius: 12px; padding: 1.5rem; display: flex; flex-direction: column; justify-content: space-between;">
<div>
<h2 style="margin-top: 0; margin-bottom: 0.75rem; color: var(--text); font-size: 1.25rem;">{{ALT_KOSMI_TITLE}}</h2>
<p style="font-size: 0.9rem; line-height: 1.5; color: var(--text-muted); margin-bottom: 1.5rem;">{{ALT_KOSMI_META_DESC}}</p>
</div>
<div class="btn btn-primary" style="align-self: flex-start; padding: 0.5rem 1rem; font-size: 0.85rem; border-radius: 6px;">
{{ALT_INDEX_READ_COMPARISON}}
</div>
</a>
<!-- TwoSeven Card -->
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/twoseven" class="guide-card" style="text-decoration: none; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--glass-border); border-radius: 12px; padding: 1.5rem; display: flex; flex-direction: column; justify-content: space-between;">
<div>
<h2 style="margin-top: 0; margin-bottom: 0.75rem; color: var(--text); font-size: 1.25rem;">{{ALT_TWOSEVEN_TITLE}}</h2>
<p style="font-size: 0.9rem; line-height: 1.5; color: var(--text-muted); margin-bottom: 1.5rem;">{{ALT_TWOSEVEN_META_DESC}}</p>
</div>
<div class="btn btn-primary" style="align-self: flex-start; padding: 0.5rem 1rem; font-size: 0.85rem; border-radius: 6px;">
{{ALT_INDEX_READ_COMPARISON}}
</div>
</a>
<!-- Screen Sharing Card -->
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/screen-sharing" class="guide-card" style="text-decoration: none; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--glass-border); border-radius: 12px; padding: 1.5rem; display: flex; flex-direction: column; justify-content: space-between;">
<div>
<h3 style="margin-top: 0; margin-bottom: 0.75rem; color: #fff; font-size: 1.25rem;">{{ALT_SCREEN_TITLE}}</h3>
<h2 style="margin-top: 0; margin-bottom: 0.75rem; color: var(--text); font-size: 1.25rem;">{{ALT_SCREEN_TITLE}}</h2>
<p style="font-size: 0.9rem; line-height: 1.5; color: var(--text-muted); margin-bottom: 1.5rem;">{{ALT_SCREEN_META_DESC}}</p>
</div>
<div class="btn btn-primary" style="align-self: flex-start; padding: 0.5rem 1rem; font-size: 0.85rem; border-radius: 6px;">
<span lang="en">Read Comparison &rarr;</span>
<span lang="de">Vergleich lesen &rarr;</span>
{{ALT_INDEX_READ_GUIDE}}
</div>
</a>
</div>
@@ -193,7 +311,7 @@
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="{{ASSET_PATH}}{{FOOTER_LEGAL_LINK}}">{{FOOTER_LEGAL}}</a>
<a href="{{ASSET_PATH}}{{FOOTER_PRIVACY_LINK}}">{{FOOTER_PRIVACY}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives"><span><span lang="en">Guides & comparisons</span><span lang="de">Vergleiche & Anleitungen</span></span></a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives">{{ALT_INDEX_FOOTER_LINK}}</a>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" style="display: inline-flex; align-items: center; gap: 4px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="14" height="14" aria-hidden="true" style="display: block;"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z"/></svg>
Mastodon
+301
View File
@@ -0,0 +1,301 @@
<!DOCTYPE html>
<html lang="{{LANG_CODE}}" class="lang-{{LANG_CODE}}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ALT_KOSMI_TITLE}}</title>
<link rel="preload" href="{{ASSET_PATH}}style.min.css" as="style">
<link rel="stylesheet" href="{{ASSET_PATH}}style.min.css">
<link rel="icon" type="image/webp" href="{{ASSET_PATH}}assets/NewLogoIcon_64.webp">
<link rel="canonical" href="https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/kosmi">
<link rel="alternate" hreflang="en" href="https://sync.koalastuff.net/alternatives/kosmi">
<link rel="alternate" hreflang="de" href="https://sync.koalastuff.net/de/alternatives/kosmi">
<link rel="alternate" hreflang="fr" href="https://sync.koalastuff.net/fr/alternatives/kosmi">
<link rel="alternate" hreflang="es" href="https://sync.koalastuff.net/es/alternatives/kosmi">
<link rel="alternate" hreflang="pt-br" href="https://sync.koalastuff.net/pt-BR/alternatives/kosmi">
<link rel="alternate" hreflang="ru" href="https://sync.koalastuff.net/ru/alternatives/kosmi">
<link rel="alternate" hreflang="it" href="https://sync.koalastuff.net/it/alternatives/kosmi">
<link rel="alternate" hreflang="pl" href="https://sync.koalastuff.net/pl/alternatives/kosmi">
<link rel="alternate" hreflang="tr" href="https://sync.koalastuff.net/tr/alternatives/kosmi">
<link rel="alternate" hreflang="nl" href="https://sync.koalastuff.net/nl/alternatives/kosmi">
<link rel="alternate" hreflang="ja" href="https://sync.koalastuff.net/ja/alternatives/kosmi">
<link rel="alternate" hreflang="ko" href="https://sync.koalastuff.net/ko/alternatives/kosmi">
<link rel="alternate" hreflang="zh" href="https://sync.koalastuff.net/zh/alternatives/kosmi">
<link rel="alternate" hreflang="uk" href="https://sync.koalastuff.net/uk/alternatives/kosmi">
<link rel="alternate" hreflang="pt" href="https://sync.koalastuff.net/pt/alternatives/kosmi">
<link rel="alternate" hreflang="x-default" href="https://sync.koalastuff.net/alternatives/kosmi">
<meta name="description" content="{{ALT_KOSMI_META_DESC}}">
<meta name="robots" content="index, follow">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="article">
<meta property="og:url" content="https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/kosmi">
<meta property="og:title" content="{{ALT_KOSMI_TITLE}}">
<meta property="og:description" content="{{ALT_KOSMI_META_DESC}}">
<meta property="og:image" content="https://sync.koalastuff.net/assets/ProContraKoala.webp">
<meta property="og:locale" content="{{OG_LOCALE}}">
<!-- Twitter / X -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ALT_KOSMI_TITLE}}">
<meta name="twitter:description" content="{{ALT_KOSMI_META_DESC}}">
<meta name="twitter:image" content="https://sync.koalastuff.net/assets/ProContraKoala.webp">
<!-- Structured Data (Schema.org) for Breadcrumbs -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
},
{
"@type": "ListItem",
"position": 2,
"name": "Alternatives",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives"
},
{
"@type": "ListItem",
"position": 3,
"name": "KoalaSync vs Kosmi",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/kosmi"
}
]
}
</script>
<!-- Structured Data (Schema.org) for WebPage -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "{{ALT_KOSMI_TITLE}}",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/kosmi",
"description": "{{ALT_KOSMI_META_DESC}}",
"inLanguage": "{{LANG_CODE}}",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
}
}
</script>
<!-- Organization Schema -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/",
"logo": "https://sync.koalastuff.net/assets/NewLogoIcon_128.webp",
"sameAs": [
"https://github.com/Shik3i/KoalaSync",
"https://mastodon.social/@koalastuff"
]
}
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#10190e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="{{ASSET_PATH}}lang-init.min.js"></script>
</head>
<body>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
<div class="container nav-content">
<a href="{{ASSET_PATH}}" class="logo-area" style="text-decoration: none;">
<img src="{{ASSET_PATH}}assets/NewLogoIcon.webp" alt="KoalaSync Logo" width="40" height="40">
<span>KoalaSync</span>
</a>
<div class="nav-links">
<a href="{{ASSET_PATH}}" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="width: 16px; height: 16px; display: block;"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>
<span>Home</span>
</a>
<a href="https://github.com/Shik3i/KoalaSync" target="_blank" rel="noopener" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="16" height="16" aria-hidden="true" style="display: block;"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
GitHub
</a>
</div>
<div class="nav-right">
<div class="lang-select-container">
<select class="lang-dropdown" aria-label="Select Language">
<option value="en">🇬🇧 English</option>
<option value="de">🇩🇪 Deutsch</option>
<option value="fr">🇫🇷 Français</option>
<option value="es">🇪🇸 Español</option>
<option value="pt-BR">🇧🇷 Português (Brasil)</option>
<option value="ru">🇷🇺 Русский</option>
<option value="it">🇮🇹 Italiano</option>
<option value="pl">🇵🇱 Polski</option>
<option value="tr">🇹🇷 Türkçe</option>
<option value="nl">🇳🇱 Nederlands</option>
<option value="ja">🇯🇵 日本語</option>
<option value="ko">🇰🇷 한국어</option>
<option value="zh">🇨🇳 中文</option>
<option value="uk">🇺🇦 Українська</option>
<option value="pt">🇵🇹 Português (Portugal)</option>
</select>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="chevron-icon"><polyline points="6 9 12 15 18 9"/></svg>
</div>
<button class="hamburger" aria-label="Menu" aria-expanded="false"></button>
</div>
</div>
</nav>
<main class="legal-content">
<div class="legal-card" data-reveal style="padding: 2rem;">
<div style="display: flex; justify-content: center;">
<img src="{{ASSET_PATH}}assets/ProContraKoala.webp" alt="Koala weighing pros and cons" class="legal-mascot" width="180" height="180">
</div>
<h1>{{ALT_KOSMI_TITLE}}</h1>
<!-- Intro -->
<section>
<p><em>{{ALT_KOSMI_INTRO}}</em></p>
</section>
<!-- When Kosmi may still make sense -->
<section>
<h2>{{ALT_KOSMI_WHEN_KOSMI_TITLE}}</h2>
<p>{{ALT_KOSMI_WHEN_KOSMI_BODY}}</p>
</section>
<!-- When KoalaSync may fit better -->
<section>
<h2>{{ALT_KOSMI_WHEN_KOALA_TITLE}}</h2>
<p>{{ALT_KOSMI_WHEN_KOALA_BODY}}</p>
</section>
<!-- The main difference -->
<section>
<h2>{{ALT_KOSMI_MAIN_DIFF_TITLE}}</h2>
<p>{{ALT_KOSMI_MAIN_DIFF_BODY}}</p>
</section>
<!-- Honest limitations -->
<section>
<h2>{{ALT_KOSMI_LIMITS_TITLE}}</h2>
<p>{{ALT_KOSMI_LIMITS_BODY}}</p>
</section>
<!-- Summary -->
<section>
<h2>{{ALT_KOSMI_SUMMARY_TITLE}}</h2>
<p>{{ALT_KOSMI_SUMMARY_BODY}}</p>
</section>
<!-- CTA block -->
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; margin-top: 3rem; padding-top: 2rem; border-top: 1px solid var(--glass-border);">
<a href="{{ASSET_PATH}}" class="btn btn-primary" style="margin-bottom: 1.5rem;">{{ALT_TRY_KOALASYNC}}</a>
<p style="font-size: 0.9rem; text-align: center; display: flex; flex-direction: column; gap: 0.5rem;">
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/teleparty" style="color: var(--accent); text-decoration: none;">{{ALT_TELEPARTY_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/scener" style="color: var(--accent); text-decoration: none;">{{ALT_SCENER_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/twoseven" style="color: var(--accent); text-decoration: none;">{{ALT_TWOSEVEN_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/watch2gether" style="color: var(--accent); text-decoration: none;">{{ALT_W2G_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/screen-sharing" style="color: var(--accent); text-decoration: none;">{{ALT_SCREEN_TITLE}}</a>
</p>
</div>
</div>
</main>
<footer>
<div class="container">
<p>&copy; 2026 KoalaSync. {{FOOTER_MIT}}</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">{{FOOTER_RAM}}</p>
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="{{ASSET_PATH}}{{FOOTER_LEGAL_LINK}}">{{FOOTER_LEGAL}}</a>
<a href="{{ASSET_PATH}}{{FOOTER_PRIVACY_LINK}}">{{FOOTER_PRIVACY}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives"><span><span lang="en">Guides & comparisons</span><span lang="de">Vergleiche & Anleitungen</span></span></a>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" style="display: inline-flex; align-items: center; gap: 4px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="14" height="14" aria-hidden="true" style="display: block;"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z"/></svg>
Mastodon
</a>
</div>
</div>
</footer>
<script src="{{ASSET_PATH}}app.min.js"></script>
</body>
</html>
+301
View File
@@ -0,0 +1,301 @@
<!DOCTYPE html>
<html lang="{{LANG_CODE}}" class="lang-{{LANG_CODE}}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ALT_SCENER_TITLE}}</title>
<link rel="preload" href="{{ASSET_PATH}}style.min.css" as="style">
<link rel="stylesheet" href="{{ASSET_PATH}}style.min.css">
<link rel="icon" type="image/webp" href="{{ASSET_PATH}}assets/NewLogoIcon_64.webp">
<link rel="canonical" href="https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/scener">
<link rel="alternate" hreflang="en" href="https://sync.koalastuff.net/alternatives/scener">
<link rel="alternate" hreflang="de" href="https://sync.koalastuff.net/de/alternatives/scener">
<link rel="alternate" hreflang="fr" href="https://sync.koalastuff.net/fr/alternatives/scener">
<link rel="alternate" hreflang="es" href="https://sync.koalastuff.net/es/alternatives/scener">
<link rel="alternate" hreflang="pt-br" href="https://sync.koalastuff.net/pt-BR/alternatives/scener">
<link rel="alternate" hreflang="ru" href="https://sync.koalastuff.net/ru/alternatives/scener">
<link rel="alternate" hreflang="it" href="https://sync.koalastuff.net/it/alternatives/scener">
<link rel="alternate" hreflang="pl" href="https://sync.koalastuff.net/pl/alternatives/scener">
<link rel="alternate" hreflang="tr" href="https://sync.koalastuff.net/tr/alternatives/scener">
<link rel="alternate" hreflang="nl" href="https://sync.koalastuff.net/nl/alternatives/scener">
<link rel="alternate" hreflang="ja" href="https://sync.koalastuff.net/ja/alternatives/scener">
<link rel="alternate" hreflang="ko" href="https://sync.koalastuff.net/ko/alternatives/scener">
<link rel="alternate" hreflang="zh" href="https://sync.koalastuff.net/zh/alternatives/scener">
<link rel="alternate" hreflang="uk" href="https://sync.koalastuff.net/uk/alternatives/scener">
<link rel="alternate" hreflang="pt" href="https://sync.koalastuff.net/pt/alternatives/scener">
<link rel="alternate" hreflang="x-default" href="https://sync.koalastuff.net/alternatives/scener">
<meta name="description" content="{{ALT_SCENER_META_DESC}}">
<meta name="robots" content="index, follow">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="article">
<meta property="og:url" content="https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/scener">
<meta property="og:title" content="{{ALT_SCENER_TITLE}}">
<meta property="og:description" content="{{ALT_SCENER_META_DESC}}">
<meta property="og:image" content="https://sync.koalastuff.net/assets/ProContraKoala.webp">
<meta property="og:locale" content="{{OG_LOCALE}}">
<!-- Twitter / X -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ALT_SCENER_TITLE}}">
<meta name="twitter:description" content="{{ALT_SCENER_META_DESC}}">
<meta name="twitter:image" content="https://sync.koalastuff.net/assets/ProContraKoala.webp">
<!-- Structured Data (Schema.org) for Breadcrumbs -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
},
{
"@type": "ListItem",
"position": 2,
"name": "Alternatives",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives"
},
{
"@type": "ListItem",
"position": 3,
"name": "KoalaSync vs Scener",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/scener"
}
]
}
</script>
<!-- Structured Data (Schema.org) for WebPage -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "{{ALT_SCENER_TITLE}}",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/scener",
"description": "{{ALT_SCENER_META_DESC}}",
"inLanguage": "{{LANG_CODE}}",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
}
}
</script>
<!-- Organization Schema -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/",
"logo": "https://sync.koalastuff.net/assets/NewLogoIcon_128.webp",
"sameAs": [
"https://github.com/Shik3i/KoalaSync",
"https://mastodon.social/@koalastuff"
]
}
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#10190e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="{{ASSET_PATH}}lang-init.min.js"></script>
</head>
<body>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
<div class="container nav-content">
<a href="{{ASSET_PATH}}" class="logo-area" style="text-decoration: none;">
<img src="{{ASSET_PATH}}assets/NewLogoIcon.webp" alt="KoalaSync Logo" width="40" height="40">
<span>KoalaSync</span>
</a>
<div class="nav-links">
<a href="{{ASSET_PATH}}" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="width: 16px; height: 16px; display: block;"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>
<span>Home</span>
</a>
<a href="https://github.com/Shik3i/KoalaSync" target="_blank" rel="noopener" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="16" height="16" aria-hidden="true" style="display: block;"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
GitHub
</a>
</div>
<div class="nav-right">
<div class="lang-select-container">
<select class="lang-dropdown" aria-label="Select Language">
<option value="en">🇬🇧 English</option>
<option value="de">🇩🇪 Deutsch</option>
<option value="fr">🇫🇷 Français</option>
<option value="es">🇪🇸 Español</option>
<option value="pt-BR">🇧🇷 Português (Brasil)</option>
<option value="ru">🇷🇺 Русский</option>
<option value="it">🇮🇹 Italiano</option>
<option value="pl">🇵🇱 Polski</option>
<option value="tr">🇹🇷 Türkçe</option>
<option value="nl">🇳🇱 Nederlands</option>
<option value="ja">🇯🇵 日本語</option>
<option value="ko">🇰🇷 한국어</option>
<option value="zh">🇨🇳 中文</option>
<option value="uk">🇺🇦 Українська</option>
<option value="pt">🇵🇹 Português (Portugal)</option>
</select>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="chevron-icon"><polyline points="6 9 12 15 18 9"/></svg>
</div>
<button class="hamburger" aria-label="Menu" aria-expanded="false"></button>
</div>
</div>
</nav>
<main class="legal-content">
<div class="legal-card" data-reveal style="padding: 2rem;">
<div style="display: flex; justify-content: center;">
<img src="{{ASSET_PATH}}assets/ProContraKoala.webp" alt="Koala weighing pros and cons" class="legal-mascot" width="180" height="180">
</div>
<h1>{{ALT_SCENER_TITLE}}</h1>
<!-- Intro -->
<section>
<p><em>{{ALT_SCENER_INTRO}}</em></p>
</section>
<!-- When Scener may still make sense -->
<section>
<h2>{{ALT_SCENER_WHEN_SCENER_TITLE}}</h2>
<p>{{ALT_SCENER_WHEN_SCENER_BODY}}</p>
</section>
<!-- When KoalaSync may fit better -->
<section>
<h2>{{ALT_SCENER_WHEN_KOALA_TITLE}}</h2>
<p>{{ALT_SCENER_WHEN_KOALA_BODY}}</p>
</section>
<!-- The main difference -->
<section>
<h2>{{ALT_SCENER_MAIN_DIFF_TITLE}}</h2>
<p>{{ALT_SCENER_MAIN_DIFF_BODY}}</p>
</section>
<!-- Honest limitations -->
<section>
<h2>{{ALT_SCENER_LIMITS_TITLE}}</h2>
<p>{{ALT_SCENER_LIMITS_BODY}}</p>
</section>
<!-- Summary -->
<section>
<h2>{{ALT_SCENER_SUMMARY_TITLE}}</h2>
<p>{{ALT_SCENER_SUMMARY_BODY}}</p>
</section>
<!-- CTA block -->
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; margin-top: 3rem; padding-top: 2rem; border-top: 1px solid var(--glass-border);">
<a href="{{ASSET_PATH}}" class="btn btn-primary" style="margin-bottom: 1.5rem;">{{ALT_TRY_KOALASYNC}}</a>
<p style="font-size: 0.9rem; text-align: center; display: flex; flex-direction: column; gap: 0.5rem;">
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/kosmi" style="color: var(--accent); text-decoration: none;">{{ALT_KOSMI_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/twoseven" style="color: var(--accent); text-decoration: none;">{{ALT_TWOSEVEN_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/teleparty" style="color: var(--accent); text-decoration: none;">{{ALT_TELEPARTY_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/watch2gether" style="color: var(--accent); text-decoration: none;">{{ALT_W2G_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/screen-sharing" style="color: var(--accent); text-decoration: none;">{{ALT_SCREEN_TITLE}}</a>
</p>
</div>
</div>
</main>
<footer>
<div class="container">
<p>&copy; 2026 KoalaSync. {{FOOTER_MIT}}</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">{{FOOTER_RAM}}</p>
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="{{ASSET_PATH}}{{FOOTER_LEGAL_LINK}}">{{FOOTER_LEGAL}}</a>
<a href="{{ASSET_PATH}}{{FOOTER_PRIVACY_LINK}}">{{FOOTER_PRIVACY}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives"><span><span lang="en">Guides & comparisons</span><span lang="de">Vergleiche & Anleitungen</span></span></a>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" style="display: inline-flex; align-items: center; gap: 4px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="14" height="14" aria-hidden="true" style="display: block;"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z"/></svg>
Mastodon
</a>
</div>
</div>
</footer>
<script src="{{ASSET_PATH}}app.min.js"></script>
</body>
</html>
+90 -6
View File
@@ -71,6 +71,23 @@
}
</script>
<!-- Structured Data (Schema.org) for WebPage -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "{{ALT_SCREEN_TITLE}}",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/screen-sharing",
"description": "{{ALT_SCREEN_META_DESC}}",
"inLanguage": "{{LANG_CODE}}",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
}
}
</script>
<!-- Organization Schema -->
<script type="application/ld+json">
{
@@ -87,17 +104,80 @@
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#0f172a">
<meta name="theme-color" content="#10190e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="{{ASSET_PATH}}lang-init.min.js"></script>
</head>
<body>
<div class="bg-blobs">
<div class="blob blob-1"></div>
<div class="blob blob-2"></div>
<div class="blob blob-3"></div>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
@@ -188,7 +268,11 @@
<!-- CTA block -->
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; margin-top: 3rem; padding-top: 2rem; border-top: 1px solid var(--glass-border);">
<a href="{{ASSET_PATH}}" class="btn btn-primary" style="margin-bottom: 1.5rem;">{{ALT_TRY_KOALASYNC}}</a>
<p style="font-size: 0.9rem; text-align: center;">
<p style="font-size: 0.9rem; text-align: center; display: flex; flex-direction: column; gap: 0.5rem;">
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/watch2gether" style="color: var(--accent); text-decoration: none;">{{ALT_W2G_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/scener" style="color: var(--accent); text-decoration: none;">{{ALT_SCENER_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/kosmi" style="color: var(--accent); text-decoration: none;">{{ALT_KOSMI_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/twoseven" style="color: var(--accent); text-decoration: none;">{{ALT_TWOSEVEN_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/teleparty" style="color: var(--accent); text-decoration: none;">{{ALT_TELEPARTY_TITLE}}</a>
</p>
</div>
+90 -6
View File
@@ -71,6 +71,23 @@
}
</script>
<!-- Structured Data (Schema.org) for WebPage -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "{{ALT_TELEPARTY_TITLE}}",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/teleparty",
"description": "{{ALT_TELEPARTY_META_DESC}}",
"inLanguage": "{{LANG_CODE}}",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
}
}
</script>
<!-- Organization Schema -->
<script type="application/ld+json">
{
@@ -87,17 +104,80 @@
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#0f172a">
<meta name="theme-color" content="#10190e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="{{ASSET_PATH}}lang-init.min.js"></script>
</head>
<body>
<div class="bg-blobs">
<div class="blob blob-1"></div>
<div class="blob blob-2"></div>
<div class="blob blob-3"></div>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
@@ -188,7 +268,11 @@
<!-- CTA block -->
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; margin-top: 3rem; padding-top: 2rem; border-top: 1px solid var(--glass-border);">
<a href="{{ASSET_PATH}}" class="btn btn-primary" style="margin-bottom: 1.5rem;">{{ALT_TRY_KOALASYNC}}</a>
<p style="font-size: 0.9rem; text-align: center;">
<p style="font-size: 0.9rem; text-align: center; display: flex; flex-direction: column; gap: 0.5rem;">
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/watch2gether" style="color: var(--accent); text-decoration: none;">{{ALT_W2G_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/scener" style="color: var(--accent); text-decoration: none;">{{ALT_SCENER_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/kosmi" style="color: var(--accent); text-decoration: none;">{{ALT_KOSMI_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/twoseven" style="color: var(--accent); text-decoration: none;">{{ALT_TWOSEVEN_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/screen-sharing" style="color: var(--accent); text-decoration: none;">{{ALT_SCREEN_TITLE}}</a>
</p>
</div>
+301
View File
@@ -0,0 +1,301 @@
<!DOCTYPE html>
<html lang="{{LANG_CODE}}" class="lang-{{LANG_CODE}}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ALT_TWOSEVEN_TITLE}}</title>
<link rel="preload" href="{{ASSET_PATH}}style.min.css" as="style">
<link rel="stylesheet" href="{{ASSET_PATH}}style.min.css">
<link rel="icon" type="image/webp" href="{{ASSET_PATH}}assets/NewLogoIcon_64.webp">
<link rel="canonical" href="https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/twoseven">
<link rel="alternate" hreflang="en" href="https://sync.koalastuff.net/alternatives/twoseven">
<link rel="alternate" hreflang="de" href="https://sync.koalastuff.net/de/alternatives/twoseven">
<link rel="alternate" hreflang="fr" href="https://sync.koalastuff.net/fr/alternatives/twoseven">
<link rel="alternate" hreflang="es" href="https://sync.koalastuff.net/es/alternatives/twoseven">
<link rel="alternate" hreflang="pt-br" href="https://sync.koalastuff.net/pt-BR/alternatives/twoseven">
<link rel="alternate" hreflang="ru" href="https://sync.koalastuff.net/ru/alternatives/twoseven">
<link rel="alternate" hreflang="it" href="https://sync.koalastuff.net/it/alternatives/twoseven">
<link rel="alternate" hreflang="pl" href="https://sync.koalastuff.net/pl/alternatives/twoseven">
<link rel="alternate" hreflang="tr" href="https://sync.koalastuff.net/tr/alternatives/twoseven">
<link rel="alternate" hreflang="nl" href="https://sync.koalastuff.net/nl/alternatives/twoseven">
<link rel="alternate" hreflang="ja" href="https://sync.koalastuff.net/ja/alternatives/twoseven">
<link rel="alternate" hreflang="ko" href="https://sync.koalastuff.net/ko/alternatives/twoseven">
<link rel="alternate" hreflang="zh" href="https://sync.koalastuff.net/zh/alternatives/twoseven">
<link rel="alternate" hreflang="uk" href="https://sync.koalastuff.net/uk/alternatives/twoseven">
<link rel="alternate" hreflang="pt" href="https://sync.koalastuff.net/pt/alternatives/twoseven">
<link rel="alternate" hreflang="x-default" href="https://sync.koalastuff.net/alternatives/twoseven">
<meta name="description" content="{{ALT_TWOSEVEN_META_DESC}}">
<meta name="robots" content="index, follow">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="article">
<meta property="og:url" content="https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/twoseven">
<meta property="og:title" content="{{ALT_TWOSEVEN_TITLE}}">
<meta property="og:description" content="{{ALT_TWOSEVEN_META_DESC}}">
<meta property="og:image" content="https://sync.koalastuff.net/assets/ProContraKoala.webp">
<meta property="og:locale" content="{{OG_LOCALE}}">
<!-- Twitter / X -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ALT_TWOSEVEN_TITLE}}">
<meta name="twitter:description" content="{{ALT_TWOSEVEN_META_DESC}}">
<meta name="twitter:image" content="https://sync.koalastuff.net/assets/ProContraKoala.webp">
<!-- Structured Data (Schema.org) for Breadcrumbs -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
},
{
"@type": "ListItem",
"position": 2,
"name": "Alternatives",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives"
},
{
"@type": "ListItem",
"position": 3,
"name": "KoalaSync vs TwoSeven",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/twoseven"
}
]
}
</script>
<!-- Structured Data (Schema.org) for WebPage -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "{{ALT_TWOSEVEN_TITLE}}",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/twoseven",
"description": "{{ALT_TWOSEVEN_META_DESC}}",
"inLanguage": "{{LANG_CODE}}",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
}
}
</script>
<!-- Organization Schema -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/",
"logo": "https://sync.koalastuff.net/assets/NewLogoIcon_128.webp",
"sameAs": [
"https://github.com/Shik3i/KoalaSync",
"https://mastodon.social/@koalastuff"
]
}
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#10190e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="{{ASSET_PATH}}lang-init.min.js"></script>
</head>
<body>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
<div class="container nav-content">
<a href="{{ASSET_PATH}}" class="logo-area" style="text-decoration: none;">
<img src="{{ASSET_PATH}}assets/NewLogoIcon.webp" alt="KoalaSync Logo" width="40" height="40">
<span>KoalaSync</span>
</a>
<div class="nav-links">
<a href="{{ASSET_PATH}}" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="width: 16px; height: 16px; display: block;"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>
<span>Home</span>
</a>
<a href="https://github.com/Shik3i/KoalaSync" target="_blank" rel="noopener" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="16" height="16" aria-hidden="true" style="display: block;"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
GitHub
</a>
</div>
<div class="nav-right">
<div class="lang-select-container">
<select class="lang-dropdown" aria-label="Select Language">
<option value="en">🇬🇧 English</option>
<option value="de">🇩🇪 Deutsch</option>
<option value="fr">🇫🇷 Français</option>
<option value="es">🇪🇸 Español</option>
<option value="pt-BR">🇧🇷 Português (Brasil)</option>
<option value="ru">🇷🇺 Русский</option>
<option value="it">🇮🇹 Italiano</option>
<option value="pl">🇵🇱 Polski</option>
<option value="tr">🇹🇷 Türkçe</option>
<option value="nl">🇳🇱 Nederlands</option>
<option value="ja">🇯🇵 日本語</option>
<option value="ko">🇰🇷 한국어</option>
<option value="zh">🇨🇳 中文</option>
<option value="uk">🇺🇦 Українська</option>
<option value="pt">🇵🇹 Português (Portugal)</option>
</select>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="chevron-icon"><polyline points="6 9 12 15 18 9"/></svg>
</div>
<button class="hamburger" aria-label="Menu" aria-expanded="false"></button>
</div>
</div>
</nav>
<main class="legal-content">
<div class="legal-card" data-reveal style="padding: 2rem;">
<div style="display: flex; justify-content: center;">
<img src="{{ASSET_PATH}}assets/ProContraKoala.webp" alt="Koala weighing pros and cons" class="legal-mascot" width="180" height="180">
</div>
<h1>{{ALT_TWOSEVEN_TITLE}}</h1>
<!-- Intro -->
<section>
<p><em>{{ALT_TWOSEVEN_INTRO}}</em></p>
</section>
<!-- When TwoSeven may still make sense -->
<section>
<h2>{{ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE}}</h2>
<p>{{ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY}}</p>
</section>
<!-- When KoalaSync may fit better -->
<section>
<h2>{{ALT_TWOSEVEN_WHEN_KOALA_TITLE}}</h2>
<p>{{ALT_TWOSEVEN_WHEN_KOALA_BODY}}</p>
</section>
<!-- The main difference -->
<section>
<h2>{{ALT_TWOSEVEN_MAIN_DIFF_TITLE}}</h2>
<p>{{ALT_TWOSEVEN_MAIN_DIFF_BODY}}</p>
</section>
<!-- Honest limitations -->
<section>
<h2>{{ALT_TWOSEVEN_LIMITS_TITLE}}</h2>
<p>{{ALT_TWOSEVEN_LIMITS_BODY}}</p>
</section>
<!-- Summary -->
<section>
<h2>{{ALT_TWOSEVEN_SUMMARY_TITLE}}</h2>
<p>{{ALT_TWOSEVEN_SUMMARY_BODY}}</p>
</section>
<!-- CTA block -->
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; margin-top: 3rem; padding-top: 2rem; border-top: 1px solid var(--glass-border);">
<a href="{{ASSET_PATH}}" class="btn btn-primary" style="margin-bottom: 1.5rem;">{{ALT_TRY_KOALASYNC}}</a>
<p style="font-size: 0.9rem; text-align: center; display: flex; flex-direction: column; gap: 0.5rem;">
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/teleparty" style="color: var(--accent); text-decoration: none;">{{ALT_TELEPARTY_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/scener" style="color: var(--accent); text-decoration: none;">{{ALT_SCENER_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/kosmi" style="color: var(--accent); text-decoration: none;">{{ALT_KOSMI_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/watch2gether" style="color: var(--accent); text-decoration: none;">{{ALT_W2G_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/screen-sharing" style="color: var(--accent); text-decoration: none;">{{ALT_SCREEN_TITLE}}</a>
</p>
</div>
</div>
</main>
<footer>
<div class="container">
<p>&copy; 2026 KoalaSync. {{FOOTER_MIT}}</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">{{FOOTER_RAM}}</p>
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="{{ASSET_PATH}}{{FOOTER_LEGAL_LINK}}">{{FOOTER_LEGAL}}</a>
<a href="{{ASSET_PATH}}{{FOOTER_PRIVACY_LINK}}">{{FOOTER_PRIVACY}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives"><span><span lang="en">Guides & comparisons</span><span lang="de">Vergleiche & Anleitungen</span></span></a>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" style="display: inline-flex; align-items: center; gap: 4px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="14" height="14" aria-hidden="true" style="display: block;"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z"/></svg>
Mastodon
</a>
</div>
</div>
</footer>
<script src="{{ASSET_PATH}}app.min.js"></script>
</body>
</html>
+301
View File
@@ -0,0 +1,301 @@
<!DOCTYPE html>
<html lang="{{LANG_CODE}}" class="lang-{{LANG_CODE}}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ALT_W2G_TITLE}}</title>
<link rel="preload" href="{{ASSET_PATH}}style.min.css" as="style">
<link rel="stylesheet" href="{{ASSET_PATH}}style.min.css">
<link rel="icon" type="image/webp" href="{{ASSET_PATH}}assets/NewLogoIcon_64.webp">
<link rel="canonical" href="https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/watch2gether">
<link rel="alternate" hreflang="en" href="https://sync.koalastuff.net/alternatives/watch2gether">
<link rel="alternate" hreflang="de" href="https://sync.koalastuff.net/de/alternatives/watch2gether">
<link rel="alternate" hreflang="fr" href="https://sync.koalastuff.net/fr/alternatives/watch2gether">
<link rel="alternate" hreflang="es" href="https://sync.koalastuff.net/es/alternatives/watch2gether">
<link rel="alternate" hreflang="pt-br" href="https://sync.koalastuff.net/pt-BR/alternatives/watch2gether">
<link rel="alternate" hreflang="ru" href="https://sync.koalastuff.net/ru/alternatives/watch2gether">
<link rel="alternate" hreflang="it" href="https://sync.koalastuff.net/it/alternatives/watch2gether">
<link rel="alternate" hreflang="pl" href="https://sync.koalastuff.net/pl/alternatives/watch2gether">
<link rel="alternate" hreflang="tr" href="https://sync.koalastuff.net/tr/alternatives/watch2gether">
<link rel="alternate" hreflang="nl" href="https://sync.koalastuff.net/nl/alternatives/watch2gether">
<link rel="alternate" hreflang="ja" href="https://sync.koalastuff.net/ja/alternatives/watch2gether">
<link rel="alternate" hreflang="ko" href="https://sync.koalastuff.net/ko/alternatives/watch2gether">
<link rel="alternate" hreflang="zh" href="https://sync.koalastuff.net/zh/alternatives/watch2gether">
<link rel="alternate" hreflang="uk" href="https://sync.koalastuff.net/uk/alternatives/watch2gether">
<link rel="alternate" hreflang="pt" href="https://sync.koalastuff.net/pt/alternatives/watch2gether">
<link rel="alternate" hreflang="x-default" href="https://sync.koalastuff.net/alternatives/watch2gether">
<meta name="description" content="{{ALT_W2G_META_DESC}}">
<meta name="robots" content="index, follow">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="article">
<meta property="og:url" content="https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/watch2gether">
<meta property="og:title" content="{{ALT_W2G_TITLE}}">
<meta property="og:description" content="{{ALT_W2G_META_DESC}}">
<meta property="og:image" content="https://sync.koalastuff.net/assets/ProContraKoala.webp">
<meta property="og:locale" content="{{OG_LOCALE}}">
<!-- Twitter / X -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ALT_W2G_TITLE}}">
<meta name="twitter:description" content="{{ALT_W2G_META_DESC}}">
<meta name="twitter:image" content="https://sync.koalastuff.net/assets/ProContraKoala.webp">
<!-- Structured Data (Schema.org) for Breadcrumbs -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
},
{
"@type": "ListItem",
"position": 2,
"name": "Alternatives",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives"
},
{
"@type": "ListItem",
"position": 3,
"name": "KoalaSync vs Watch2Gether",
"item": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/watch2gether"
}
]
}
</script>
<!-- Structured Data (Schema.org) for WebPage -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "{{ALT_W2G_TITLE}}",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}alternatives/watch2gether",
"description": "{{ALT_W2G_META_DESC}}",
"inLanguage": "{{LANG_CODE}}",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/{{LANG_PREFIX}}"
}
}
</script>
<!-- Organization Schema -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/",
"logo": "https://sync.koalastuff.net/assets/NewLogoIcon_128.webp",
"sameAs": [
"https://github.com/Shik3i/KoalaSync",
"https://mastodon.social/@koalastuff"
]
}
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#10190e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="{{ASSET_PATH}}lang-init.min.js"></script>
</head>
<body>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
<div class="container nav-content">
<a href="{{ASSET_PATH}}" class="logo-area" style="text-decoration: none;">
<img src="{{ASSET_PATH}}assets/NewLogoIcon.webp" alt="KoalaSync Logo" width="40" height="40">
<span>KoalaSync</span>
</a>
<div class="nav-links">
<a href="{{ASSET_PATH}}" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="width: 16px; height: 16px; display: block;"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>
<span>Home</span>
</a>
<a href="https://github.com/Shik3i/KoalaSync" target="_blank" rel="noopener" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="16" height="16" aria-hidden="true" style="display: block;"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
GitHub
</a>
</div>
<div class="nav-right">
<div class="lang-select-container">
<select class="lang-dropdown" aria-label="Select Language">
<option value="en">🇬🇧 English</option>
<option value="de">🇩🇪 Deutsch</option>
<option value="fr">🇫🇷 Français</option>
<option value="es">🇪🇸 Español</option>
<option value="pt-BR">🇧🇷 Português (Brasil)</option>
<option value="ru">🇷🇺 Русский</option>
<option value="it">🇮🇹 Italiano</option>
<option value="pl">🇵🇱 Polski</option>
<option value="tr">🇹🇷 Türkçe</option>
<option value="nl">🇳🇱 Nederlands</option>
<option value="ja">🇯🇵 日本語</option>
<option value="ko">🇰🇷 한국어</option>
<option value="zh">🇨🇳 中文</option>
<option value="uk">🇺🇦 Українська</option>
<option value="pt">🇵🇹 Português (Portugal)</option>
</select>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="chevron-icon"><polyline points="6 9 12 15 18 9"/></svg>
</div>
<button class="hamburger" aria-label="Menu" aria-expanded="false"></button>
</div>
</div>
</nav>
<main class="legal-content">
<div class="legal-card" data-reveal style="padding: 2rem;">
<div style="display: flex; justify-content: center;">
<img src="{{ASSET_PATH}}assets/ProContraKoala.webp" alt="Koala weighing pros and cons" class="legal-mascot" width="180" height="180">
</div>
<h1>{{ALT_W2G_TITLE}}</h1>
<!-- Intro -->
<section>
<p><em>{{ALT_W2G_INTRO}}</em></p>
</section>
<!-- When Watch2Gether may still make sense -->
<section>
<h2>{{ALT_W2G_WHEN_W2G_TITLE}}</h2>
<p>{{ALT_W2G_WHEN_W2G_BODY}}</p>
</section>
<!-- When KoalaSync may fit better -->
<section>
<h2>{{ALT_W2G_WHEN_KOALA_TITLE}}</h2>
<p>{{ALT_W2G_WHEN_KOALA_BODY}}</p>
</section>
<!-- The main difference -->
<section>
<h2>{{ALT_W2G_MAIN_DIFF_TITLE}}</h2>
<p>{{ALT_W2G_MAIN_DIFF_BODY}}</p>
</section>
<!-- Honest limitations -->
<section>
<h2>{{ALT_W2G_LIMITS_TITLE}}</h2>
<p>{{ALT_W2G_LIMITS_BODY}}</p>
</section>
<!-- Summary -->
<section>
<h2>{{ALT_W2G_SUMMARY_TITLE}}</h2>
<p>{{ALT_W2G_SUMMARY_BODY}}</p>
</section>
<!-- CTA block -->
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; margin-top: 3rem; padding-top: 2rem; border-top: 1px solid var(--glass-border);">
<a href="{{ASSET_PATH}}" class="btn btn-primary" style="margin-bottom: 1.5rem;">{{ALT_TRY_KOALASYNC}}</a>
<p style="font-size: 0.9rem; text-align: center; display: flex; flex-direction: column; gap: 0.5rem;">
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/scener" style="color: var(--accent); text-decoration: none;">{{ALT_SCENER_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/kosmi" style="color: var(--accent); text-decoration: none;">{{ALT_KOSMI_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/twoseven" style="color: var(--accent); text-decoration: none;">{{ALT_TWOSEVEN_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/teleparty" style="color: var(--accent); text-decoration: none;">{{ALT_TELEPARTY_TITLE}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives/screen-sharing" style="color: var(--accent); text-decoration: none;">{{ALT_SCREEN_TITLE}}</a>
</p>
</div>
</div>
</main>
<footer>
<div class="container">
<p>&copy; 2026 KoalaSync. {{FOOTER_MIT}}</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">{{FOOTER_RAM}}</p>
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="{{ASSET_PATH}}{{FOOTER_LEGAL_LINK}}">{{FOOTER_LEGAL}}</a>
<a href="{{ASSET_PATH}}{{FOOTER_PRIVACY_LINK}}">{{FOOTER_PRIVACY}}</a>
<a href="{{ASSET_PATH}}{{LANG_PREFIX}}alternatives"><span><span lang="en">Guides & comparisons</span><span lang="de">Vergleiche & Anleitungen</span></span></a>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" style="display: inline-flex; align-items: center; gap: 4px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="14" height="14" aria-hidden="true" style="display: block;"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z"/></svg>
Mastodon
</a>
</div>
</div>
</footer>
<script src="{{ASSET_PATH}}app.min.js"></script>
</body>
</html>
+1056 -69
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,22 @@
{
"comment": "Generated by tools/subset-flag-font.mjs — do not edit. build.cjs fails when site flags and this manifest diverge.",
"flags": [
"BR",
"CN",
"DE",
"ES",
"FR",
"GB",
"IT",
"JP",
"KR",
"NL",
"PL",
"PT",
"RU",
"TR",
"UA"
],
"sourceFontSha256": "9f04f14429bb6a9f415c7a4dd902a918d7e81a4f7526c415496fdb063954e3b8",
"subsetSha256": "d6683cd924e343443effaa96008656e9914c168afad6cd8ac168af79e2b65811"
}
Binary file not shown.
+40
View File
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1041px" height="565px" viewBox="0 0 1041 565" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<!-- Generated by Pixelmator Pro 2.2 -->
<g id="Layer_1">
<g id="group">
<g id="group-1">
<g id="group-2">
<path id="Path" d="M735.8 365.7 C721.4 369 683.5 370.9 683.5 370.9 L678.7 385.9 C678.7 385.9 697.6 384.3 711.4 385.7 711.4 385.7 715.9 385.2 716.4 390.8 716.6 396 716 401.6 716 401.6 716 401.6 715.7 405 710.9 405.8 705.7 406.7 670.1 408 670.1 408 L664.3 427.5 C664.3 427.5 662.2 432 667 430.7 671.5 429.5 708.8 422.5 713.7 423.5 718.9 424.8 724.7 431.7 723 438.1 721 445.9 683.8 469.7 661.1 468 661.1 468 649.2 468.8 639.1 452.7 629.7 437.4 642.7 408.3 642.7 408.3 642.7 408.3 636.8 394.7 641.1 390.2 641.1 390.2 643.7 387.9 651.1 387.3 L660.2 368.4 C660.2 368.4 649.8 369.1 643.6 361.5 637.8 354.2 637.4 350.9 641.8 348.9 646.5 346.6 689.8 338.7 719.6 339.7 719.6 339.7 730 338.7 738.9 356.7 738.8 356.7 743.2 364 735.8 365.7 Z M623.7 438.3 C619.9 447.3 609.8 456.9 597.3 450.9 584.9 444.9 565.2 404.6 565.2 404.6 565.2 404.6 557.7 389.6 556.3 389.9 556.3 389.9 554.7 387 553.7 403.4 552.7 419.8 553.9 451.7 547.4 456.7 541.2 461.7 533.7 459.7 529.8 453.8 526.3 448 524.8 434.2 526.7 410 529 385.8 534.6 360 541.8 351.9 549 343.9 554.8 349.7 557 351.8 557 351.8 566.6 360.5 582.5 386.1 L585.3 390.8 C585.3 390.8 599.7 415 601.2 414.9 601.2 414.9 602.4 416 603.4 415.2 604.9 414.8 604.3 407 604.3 407 604.3 407 601.3 380.7 588.2 336.1 588.2 336.1 586.2 330.5 587.6 325.3 588.9 320 594.2 322.5 594.2 322.5 594.2 322.5 614.6 332.7 624.4 365.9 634.1 399.4 627.5 429.3 623.7 438.3 Z M523.5 353 C521.8 356.4 520.8 361.3 512.2 362.6 512.2 362.6 429.9 368.2 426 374 426 374 423.1 377.4 427.6 378.4 432.1 379.3 450.7 381.8 459.7 382.3 469.3 382.4 501.7 382.7 513.3 397.2 513.3 397.2 520.2 404.1 519.9 419.7 519.6 435.7 516.8 441.3 510.6 447.1 504.1 452.5 448.3 477.5 412.3 439.1 412.3 439.1 395.7 420.6 418 406.6 418 406.6 434.1 396.9 475 408.3 475 408.3 487.4 412.8 486.8 417.3 486.1 422.1 476.6 427.2 462.8 426.9 449.4 426.5 439.6 420.1 441.5 421.1 443.3 421.8 427.1 413.3 422.1 419.1 417.1 424.4 418.3 427.7 423.2 431 435.7 438.1 484 435.6 498.4 419.6 498.4 419.6 504.1 413.1 495.4 407.8 486.7 402.8 461.8 399.8 452.1 399.3 442.8 398.8 408.2 399.4 403.2 390.2 403.2 390.2 398.2 384 403.7 366.4 409.5 348 449.8 340.9 467.2 339.3 467.2 339.3 515.1 337.6 523.9 347.4 523.8 347.4 525 349.7 523.5 353 Z M387.5 460.9 C381.7 465.2 369.4 463.3 365.9 458.5 362.4 454.2 361.2 437.1 361.9 410.3 362.6 383.2 363.2 349.6 369 344.3 375.2 338.9 379 343.6 381.4 347.3 384 350.9 387.1 354.9 387.8 363.4 388.4 371.9 390.4 416.5 390.4 416.5 390.4 416.5 393 456.7 387.5 460.9 Z M400 317.1 C383.1 322.7 371.5 320.8 361.7 316.6 357.4 324.1 354.9 326.4 351.6 326.9 346.8 327.4 342.5 319.7 341.7 317.2 340.9 315.3 338.6 312.1 341.4 304.5 331.8 295.9 331.1 284.3 332.7 276.5 335.1 267.5 351.3 233.3 400.6 229.3 400.6 229.3 424.7 227.5 428.8 240.4 L429.5 240.4 C429.5 240.4 452.9 240.5 452.4 261.3 452.1 282.2 426.4 308.2 400 317.1 Z M354 270.8 C349 278.8 348.8 283.6 351.1 286.9 356.8 278.2 367.2 264.5 382.5 254.1 370.7 255.1 360.8 260.2 354 270.8 Z M422.1 257.4 C406.6 259.7 382.6 280.5 371.2 297.5 388.7 300.7 419.6 299.5 433.3 271.6 433.2 271.6 439.8 254.3 422.1 257.4 Z M842.9 418.5 C833.6 434.7 807.5 468.5 772.7 460.6 761.2 488.5 751.6 516.6 746.1 558.8 746.1 558.8 744.9 567 738.1 564.1 731.4 561.7 720.2 550.5 718 535 715.6 514.6 724.7 480.1 743.2 440.6 737.8 431.8 734.1 419.2 737.3 401.3 737.3 401.3 742 368.1 775.3 338.1 775.3 338.1 779.3 334.6 781.6 335.7 784.2 336.8 783 347.6 780.9 352.8 778.8 358 763.9 383.8 763.9 383.8 763.9 383.8 754.6 401.2 757.2 414.9 774.7 388 814.5 333.7 839.2 350.8 847.5 356.7 851.3 369.6 851.3 383.5 851.2 395.8 848.3 408.8 842.9 418.5 Z M835.7 375.9 C835.7 375.9 834.3 365.2 823.9 377 814.9 386.9 798.7 405.6 785.6 430.9 799.3 429.4 812.5 421.9 816.5 418.1 823 412.3 838.1 396.7 835.7 375.9 Z M350.2 389.5 C348.3 413.7 339 454.4 273.1 474.5 229.6 487.6 188.5 481.3 166.1 475.6 165.6 484.5 164.6 488.3 163.2 489.8 161.3 491.7 147.1 499.9 139.3 488.3 135.8 482.8 134 472.8 133 463.9 82.6 440.7 59.4 407.3 58.5 405.8 57.4 404.7 45.9 392.7 57.4 378 68.2 364.7 103.5 351.4 135.3 346 136.4 318.8 139.6 298.3 143.4 288.9 148 278 153.8 287.8 158.8 295.2 163 300.7 165.5 324.4 165.7 343.3 186.5 342.3 198.8 343.8 222 348 252.2 353.5 272.4 368.9 270.6 386.4 269.3 403.6 253.5 410.7 247.5 411.2 241.2 411.7 231.4 407.2 231.4 407.2 224.7 404 230.9 401.2 239 397.7 247.8 393.4 245.8 389 245.8 389 242.5 379.4 203.3 372.7 164.3 372.7 164.1 394.2 165.2 429.9 165.7 450.7 193 455.9 213.4 454.9 213.4 454.9 213.4 454.9 313 452.1 316 388.5 319.1 324.8 216.7 263.7 141 244.3 65.4 224.5 22.6 238.3 18.9 240.2 14.9 242.2 18.6 242.8 18.6 242.8 18.6 242.8 22.7 243.4 29.8 245.8 37.3 248.2 31.5 252.1 31.5 252.1 18.6 256.2 4.1 253.6 1.3 247.7 -1.5 241.8 3.2 236.5 8.6 228.9 14 220.9 19.9 221.2 19.9 221.2 113.4 188.8 227.3 247.4 227.3 247.4 334 301.5 352.2 364.9 350.2 389.5 Z M68 386.2 C57.4 391.4 64.7 398.9 64.7 398.9 84.6 420.3 109.1 433.7 132.4 442 135.1 405.1 134.7 392.1 135 373.5 98.6 376 77.6 381.8 68 386.2 Z" fill="#01147c" fill-opacity="1" stroke="none"/>
</g>
</g>
<g id="group-3">
<g id="group-4">
<g id="group-5">
<path id="Path-1" d="M1040.9 378.6 L1040.9 391.8 C1040.9 394.7 1038.6 397 1035.7 397 L972.8 397 C972.8 400.3 972.9 403.2 972.9 405.9 972.9 425.4 972.1 441.3 970.2 459.2 969.9 461.9 967.7 463.9 965.1 463.9 L951.5 463.9 C950.1 463.9 948.8 463.3 947.9 462.3 947 461.3 946.5 459.9 946.7 458.5 948.6 440.7 949.5 425 949.5 405.9 949.5 403.1 949.5 400.2 949.4 397 L887.2 397 C884.3 397 882 394.7 882 391.8 L882 378.6 C882 375.7 884.3 373.4 887.2 373.4 L948.5 373.4 C947.2 351.9 944.6 331.2 940.4 310.2 940.2 308.9 940.5 307.6 941.3 306.6 942.1 305.6 943.3 305 944.6 305 L959.3 305 C961.6 305 963.5 306.6 964 308.9 968.1 330.6 970.7 351.7 972 373.4 L1035.7 373.4 C1038.5 373.4 1040.9 375.8 1040.9 378.6 Z" fill="#01147c" fill-opacity="1" stroke="none"/>
</g>
</g>
</g>
<g id="group-6">
<g id="group-7">
<path id="Path-2" d="M200.2 204.3 L200.1 204.3 M199.4 204.4 C199.1 204.4 198.8 204.3 198.5 204.3 198.8 204.4 199.1 204.4 199.4 204.4 L199.7 204.4 C199.6 204.4 199.5 204.4 199.4 204.4 Z M199.4 204.4 C199.1 204.4 198.8 204.3 198.5 204.3 198.8 204.4 199.1 204.4 199.4 204.4 L199.7 204.4 C199.6 204.4 199.5 204.4 199.4 204.4 Z" fill="none" stroke="none"/>
<defs>
<radialGradient id="radial-gradient" gradientUnits="userSpaceOnUse" cx="942.524" cy="279.896" r="760.124" fx="942.524" fy="279.896">
<stop offset="0.007" stop-color="#021192" stop-opacity="1"/>
<stop offset="0.03" stop-color="#021096" stop-opacity="1"/>
<stop offset="0.057" stop-color="#010cb4" stop-opacity="1"/>
<stop offset="0.084" stop-color="#0008ce" stop-opacity="1"/>
<stop offset="0.111" stop-color="#0006d7" stop-opacity="1"/>
<stop offset="0.138" stop-color="#0004e1" stop-opacity="1"/>
<stop offset="0.165" stop-color="#0001fa" stop-opacity="1"/>
<stop offset="0.191" stop-color="#0000fe" stop-opacity="1"/>
<stop offset="0.216" stop-color="#0f1eff" stop-opacity="1"/>
<stop offset="1" stop-color="#00ffff" stop-opacity="0"/>
</radialGradient>
</defs>
<path id="Path-3" d="M955.3 273.9 C922.8 194 867.9 125.9 796.5 76.9 723.4 26.8 637.7 0.3 548.7 0.3 401.5 0.3 264.9 73.4 183.4 195.9 182.5 197.2 182.3 198.9 182.8 200.4 183.3 202 184.5 203.1 186 203.6 L197.4 207.5 C198.1 207.7 198.8 207.8 199.4 207.8 201.5 207.8 203.5 206.7 204.7 205 242.1 150 292.7 104.3 351.1 72.7 411.4 40.1 479.7 22.8 548.6 22.8 631.9 22.8 712.2 47.4 781 93.8 848.1 139.1 900.2 202.4 931.7 276.7 932.6 278.9 934.8 280.4 937.2 280.4 L950.8 280.4 C952.4 280.4 953.9 279.6 954.7 278.3 955.7 277 955.9 275.4 955.3 273.9 Z M199.4 204.4 C199.1 204.4 198.8 204.3 198.5 204.2 198.8 204.3 199.1 204.4 199.4 204.4 L199.6 204.4 C199.6 204.4 199.5 204.4 199.4 204.4 Z M934.4 278.6 C934.7 278.8 935 279 935.3 279.1 935 278.9 934.7 278.8 934.4 278.6 Z" fill-opacity="1" fill="url(#radial-gradient)" stroke="none"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

+435 -48
View File
@@ -7,18 +7,103 @@ const path = require('path');
const crypto = require('crypto');
const sharp = require('sharp');
const esbuild = require('esbuild');
const htmlnano = require('htmlnano');
const { optimize: svgoOptimize } = require('svgo');
// CSS minifier: simple regex-based (proven, 27% reduction, no deps)
function minifyCSS(code) {
return code
.replace(/\/\*[\s\S]*?\*\//g, '')
.replace(/\s*([{}:;,])\s*/g, '$1')
// Never strip whitespace before `:`: `.parent :is(...)` is a
// descendant selector, while `.parent:is(...)` targets the parent.
.replace(/\s*([{},;])\s*/g, '$1')
.replace(/:\s+/g, ':')
.replace(/\s+/g, ' ')
.replace(/;\}/g, '}')
.trim();
}
const MIN_AVIF_KB = 0;
if (minifyCSS('.parent :is(.a, .b) { color: red; }') !== '.parent :is(.a,.b){color:red}') {
throw new Error('CSS minifier must preserve descendant combinators before functional pseudo-classes');
}
// HTML only: parser-based comment removal and conservative whitespace collapse.
// CSS, JS, JSON, and SVG keep their dedicated build steps below.
const HTML_MINIFY_OPTIONS = Object.freeze({
skipConfigLoading: true,
removeComments: 'safe',
collapseWhitespace: 'conservative'
});
const HTML_MINIFY_PRESET = Object.freeze({});
async function minifyHTML(html) {
return (await htmlnano.process(html, HTML_MINIFY_OPTIONS, HTML_MINIFY_PRESET)).html;
}
async function verifyHTMLMinifier() {
const pre = '<pre> keep\n exactly </pre>';
const jsonLd = '<script type="application/ld+json">{"name":"KoalaSync"}</script>';
const conditional = '<!--[if IE]>legacy<![endif]-->';
const result = await minifyHTML(`<!<!--nested-->--unsafe-->${pre}${jsonLd}${conditional}`);
const ordinaryComments = result.replace(conditional, '');
if (ordinaryComments.includes('<!--') || !result.includes(pre) || !result.includes(conditional)) {
throw new Error('HTML minifier security/preservation invariant failed');
}
JSON.parse(result.match(/<script type="application\/ld\+json">([\s\S]*?)<\/script>/)[1]);
}
// ── Country-flag font subset (committed artifact, validated here) ────────
// The subset itself is generated by tools/subset-flag-font.mjs (Python
// fontTools — the harfbuzz-based JS subsetters drop the COLR/CPAL color
// tables and produce invisible flags, so the build never subsets itself).
// This step verifies the committed subset still matches the site and ships
// it under a content-hashed name.
function stageFlagFontSubset(websiteDir, wwwDir) {
const { collectFlagSourceFiles, extractUsedFlags, flagToCountryCode } = require('./flag-font-utils.cjs');
const assetsDir = path.join(websiteDir, 'assets');
const subsetPath = path.join(assetsDir, 'TwemojiCountryFlags.subset.woff2');
const manifestPath = path.join(assetsDir, 'TwemojiCountryFlags.subset.json');
const regenerate = 'run "npm run subset-flags" and commit the result';
if (!fs.existsSync(subsetPath) || !fs.existsSync(manifestPath)) {
throw new Error(`Flag font subset or manifest missing ${regenerate}`);
}
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
const subset = fs.readFileSync(subsetPath);
const sha256 = buf => crypto.createHash('sha256').update(buf).digest('hex');
if (sha256(subset) !== manifest.subsetSha256) {
throw new Error(`TwemojiCountryFlags.subset.woff2 does not match its manifest ${regenerate}`);
}
const sourceFont = fs.readFileSync(path.join(assetsDir, 'TwemojiCountryFlags.woff2'));
if (sha256(sourceFont) !== manifest.sourceFontSha256) {
throw new Error(`TwemojiCountryFlags.woff2 changed since the subset was generated ${regenerate}`);
}
const usedFlags = extractUsedFlags(collectFlagSourceFiles(websiteDir));
if (usedFlags.length === 0) {
throw new Error('Flag extraction found no flag emoji extraction is broken');
}
const usedCodes = usedFlags.map(flagToCountryCode);
const missing = usedCodes.filter(c => !manifest.flags.includes(c));
if (missing.length > 0) {
throw new Error(`Flags used on the site but missing from the font subset: ${missing.join(', ')} ${regenerate}`);
}
const extra = manifest.flags.filter(c => !usedCodes.includes(c));
if (extra.length > 0) {
console.warn(` ⚠️ Subset contains unused flags (${extra.join(', ')}) "npm run subset-flags" would shrink it.`);
}
const name = `TwemojiCountryFlags.${sha8(subset)}.woff2`;
const destAssets = path.join(wwwDir, 'assets');
fs.mkdirSync(destAssets, { recursive: true });
for (const f of fs.readdirSync(destAssets)) {
if (/^TwemojiCountryFlags\.[0-9a-f]{8}\.woff2$/.test(f) && f !== name) {
fs.unlinkSync(path.join(destAssets, f));
}
}
fs.writeFileSync(path.join(destAssets, name), subset);
const pct = ((1 - subset.length / sourceFont.length) * 100).toFixed(0);
console.log(` Flag font: ${name} (${(subset.length / 1024).toFixed(1)} KB, ${usedCodes.length} flags, -${pct}% vs unsubset)`);
return name;
}
function copyDirSync(src, dest) {
fs.mkdirSync(dest, { recursive: true });
@@ -30,12 +115,13 @@ function copyDirSync(src, dest) {
}
function sha8(buf) { return crypto.createHash('sha256').update(buf).digest('hex').slice(0, 8); }
function sha384(buf) { return 'sha384-' + crypto.createHash('sha384').update(buf).digest('base64'); }
async function minifyJS(raw) {
const result = await esbuild.transform(raw, {
loader: 'js',
minify: true,
target: 'es2020'
target: 'es2022'
});
return result.code;
}
@@ -50,7 +136,12 @@ function injectAvifPictures(html) {
const srcsetMatch = attrs.match(/\bsrcset="([^"]*)"/i);
if (srcsetMatch) {
const avifSrcset = srcsetMatch[1].replace(/\.webp/gi, '.avif');
return `<picture><source srcset="${avifSrcset}" type="image/avif"><img${attrs}></picture>`;
// A <source> with width descriptors requires its own sizes
// attribute; without it browsers may pick and even reject
// candidates (observed as broken images in Chrome).
const sizesMatch = attrs.match(/\bsizes="([^"]*)"/i);
const sizesAttr = sizesMatch ? ` sizes="${sizesMatch[1]}"` : '';
return `<picture><source srcset="${avifSrcset}"${sizesAttr} type="image/avif"><img${attrs}></picture>`;
}
return `<picture><source srcset="${avifSrc}" type="image/avif"><img${attrs}></picture>`;
});
@@ -67,6 +158,7 @@ function minifyInlineSvgs(html) {
}
async function compile() {
await verifyHTMLMinifier();
console.log('Starting KoalaSync i18n compilation...');
const websiteDir = __dirname;
const wwwDir = path.join(websiteDir, 'www');
@@ -117,27 +209,94 @@ async function compile() {
}
console.log(' ✓ Favicons/touch icons successfully synced to website/assets/');
// Social link preview image (og:image / twitter:image), same artwork as the
// GitHub repository OpenGraph card. PNG kept for maximum scraper support.
const ogSrc = path.join(websiteDir, '..', 'assets', 'StoreAssets', 'RepositoryOpenGraph.png');
if (fs.existsSync(ogSrc)) {
await sharp(ogSrc)
.png({ quality: 80, palette: true })
.toFile(path.join(targetAssetsDir, 'og-image.png'));
console.log(' ✓ og-image.png generated from RepositoryOpenGraph.png');
} else {
console.warn(` ⚠️ Warning: ${ogSrc} not found. Skipping og-image generation.`);
}
// ── 0.7 Stage the committed flag-font subset (~45% smaller) ──
console.log('Staging flag font subset...');
const flagFontName = stageFlagFontSubset(websiteDir, wwwDir);
// ── 1. Minify CSS/JS (must happen first so hashes go into HTML) ──
console.log('Minifying CSS/JS...');
const styleRaw = fs.readFileSync(path.join(websiteDir, 'style.css'), 'utf8');
// CSS references the hashed subset instead of the raw font file
const readStyle = relativePath => fs.readFileSync(path.join(websiteDir, relativePath), 'utf8')
.replaceAll('TwemojiCountryFlags.woff2', flagFontName);
const styleModules = [
'styles/foundation.css',
'styles/hero.css',
'styles/landing-primary.css',
'styles/legal.css',
'styles/landing-controls.css',
'styles/join-spinner.css',
'styles/landing-sections.css',
'styles/join.css',
'styles/landing-faq.css',
'styles/alternatives.css',
'styles/demo.css'
];
// Keep the landing cascade equivalent to styleModules while excluding
// utility-page-only rules. A single blocking file avoids both request
// fan-out and layout shifts from activating structural CSS after paint.
const landingBundles = [
{
key: 'landing',
modules: [
'styles/foundation.css',
'styles/hero.css',
'styles/landing-primary.css',
'styles/legal.css',
'styles/landing-controls.css',
'styles/landing-sections.css',
'styles/landing-selfhost.css',
'styles/landing-faq.css',
'styles/demo.css'
]
}
];
const styleRaw = styleModules.map(readStyle).join('');
const styleMin = minifyCSS(styleRaw);
const styleHash = sha8(styleMin);
const styleName = `style.${styleHash}.min.css`;
const styleSRI = sha384(styleMin);
const compiledLandingBundles = landingBundles.map(bundle => {
const raw = bundle.modules.map(readStyle).join('');
const min = minifyCSS(raw);
return {
...bundle,
min,
name: `${bundle.key === 'landing' ? 'landing' : `landing-${bundle.key}`}.${sha8(min)}.min.css`,
sri: sha384(min)
};
});
const appRaw = fs.readFileSync(path.join(websiteDir, 'app.js'), 'utf8');
const appMin = await minifyJS(appRaw);
const appHash = sha8(appMin);
const appName = `app.${appHash}.min.js`;
const appSRI = sha384(appMin);
const langRaw = fs.readFileSync(path.join(websiteDir, 'lang-init.js'), 'utf8');
const langMin = await minifyJS(langRaw);
const langHash = sha8(langMin);
const langName = `lang-init.${langHash}.min.js`;
const langSRI = sha384(langMin);
const stylePct = ((1 - styleMin.length / styleRaw.length) * 100).toFixed(0);
const appPct = ((1 - appMin.length / appRaw.length) * 100).toFixed(0);
const langPct = ((1 - langMin.length / langRaw.length) * 100).toFixed(0);
console.log(` CSS: ${styleName} (${(styleMin.length/1024).toFixed(1)} KB, -${stylePct}%)`);
for (const bundle of compiledLandingBundles) {
console.log(` Landing ${bundle.key}: ${bundle.name} (${(bundle.min.length/1024).toFixed(1)} KB)`);
}
console.log(` App: ${appName} (${(appMin.length/1024).toFixed(1)} KB, -${appPct}%)`);
console.log(` Lang: ${langName} (${(langMin.length/1024).toFixed(1)} KB, -${langPct}%)`);
@@ -151,6 +310,9 @@ async function compile() {
// Write minified files
fs.writeFileSync(path.join(wwwDir, styleName), styleMin);
for (const bundle of compiledLandingBundles) {
fs.writeFileSync(path.join(wwwDir, bundle.name), bundle.min);
}
fs.writeFileSync(path.join(wwwDir, appName), appMin);
fs.writeFileSync(path.join(wwwDir, langName), langMin);
@@ -174,13 +336,14 @@ async function compile() {
let compiled = templateContent;
compiled = compiled.replace(/\{\{ASSET_PATH\}\}/g, assetPath);
compiled = compiled.replace(/\{\{VERSION\}\}/g, buildVersion);
compiled = compiled.replace(/\{\{VERSION_DATE\}\}/g, versionJson.date || '');
const langPrefix = lang === 'en' ? '' : `${lang}/`;
compiled = compiled.replace(/\{\{LANG_PREFIX\}\}/g, langPrefix);
languages.forEach(l => {
compiled = compiled.replace(new RegExp(`\\{\\{SELECTED_${l.toUpperCase()}\\}\\}`, 'g'), l === lang ? 'selected' : '');
});
for (const [key, value] of Object.entries(locale)) {
compiled = compiled.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value);
compiled = compiled.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), () => value);
}
return compiled;
}
@@ -188,12 +351,24 @@ async function compile() {
// Read alternative page templates
const telepartyTemplatePath = path.join(websiteDir, 'alternatives/teleparty.html');
const screenSharingTemplatePath = path.join(websiteDir, 'alternatives/screen-sharing.html');
const watch2getherTemplatePath = path.join(websiteDir, 'alternatives/watch2gether.html');
const scenerTemplatePath = path.join(websiteDir, 'alternatives/scener.html');
const kosmiTemplatePath = path.join(websiteDir, 'alternatives/kosmi.html');
const twosevenTemplatePath = path.join(websiteDir, 'alternatives/twoseven.html');
const overviewTemplatePath = path.join(websiteDir, 'alternatives/index.html');
const hasTelepartyTemplate = fs.existsSync(telepartyTemplatePath);
const hasScreenSharingTemplate = fs.existsSync(screenSharingTemplatePath);
const hasWatch2getherTemplate = fs.existsSync(watch2getherTemplatePath);
const hasScenerTemplate = fs.existsSync(scenerTemplatePath);
const hasKosmiTemplate = fs.existsSync(kosmiTemplatePath);
const hasTwosevenTemplate = fs.existsSync(twosevenTemplatePath);
const hasOverviewTemplate = fs.existsSync(overviewTemplatePath);
const telepartyTemplate = hasTelepartyTemplate ? fs.readFileSync(telepartyTemplatePath, 'utf8') : '';
const screenSharingTemplate = hasScreenSharingTemplate ? fs.readFileSync(screenSharingTemplatePath, 'utf8') : '';
const watch2getherTemplate = hasWatch2getherTemplate ? fs.readFileSync(watch2getherTemplatePath, 'utf8') : '';
const scenerTemplate = hasScenerTemplate ? fs.readFileSync(scenerTemplatePath, 'utf8') : '';
const kosmiTemplate = hasKosmiTemplate ? fs.readFileSync(kosmiTemplatePath, 'utf8') : '';
const twosevenTemplate = hasTwosevenTemplate ? fs.readFileSync(twosevenTemplatePath, 'utf8') : '';
const overviewTemplate = hasOverviewTemplate ? fs.readFileSync(overviewTemplatePath, 'utf8') : '';
// Preload English locale for fallback
@@ -207,14 +382,6 @@ async function compile() {
compiled = compiled.replace(/\{\{LANG_PREFIX\}\}/g, langPrefix);
compiled = compiled.replace(/\{\{VERSION\}\}/g, buildVersion);
const indexTitle = lang === 'de' ? 'KoalaSync - Vergleiche & Anleitungen' : 'KoalaSync - Alternatives & Comparisons';
const indexDesc = lang === 'de'
? 'Entdecke ehrliche Vergleiche und detaillierte Leitfäden zwischen KoalaSync und anderen Watch-Party-Erweiterungen.'
: 'Explore honest comparisons and detailed guides comparing KoalaSync with other watch party extensions and streaming solutions.';
compiled = compiled.replace(/\{\{ALT_INDEX_TITLE\}\}/g, indexTitle);
compiled = compiled.replace(/\{\{ALT_INDEX_META_DESC\}\}/g, indexDesc);
// og:locale mapping for Facebook
const ogLocales = {
en: 'en_US', de: 'de_DE', fr: 'fr_FR', es: 'es_ES',
@@ -227,7 +394,7 @@ async function compile() {
// Merge locale with English fallback for keys not present in current locale
const mergedLocale = { ...englishLocale, ...locale };
for (const [key, value] of Object.entries(mergedLocale)) {
compiled = compiled.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value);
compiled = compiled.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), () => value);
}
return compiled;
}
@@ -256,6 +423,30 @@ async function compile() {
const ssCompiled = compileAlternativePage(screenSharingTemplate, locale, lang, '../', '');
fs.writeFileSync(path.join(altDir, 'screen-sharing.html'), ssCompiled);
}
if (hasWatch2getherTemplate) {
const altDir = path.join(wwwDir, 'alternatives');
fs.mkdirSync(altDir, { recursive: true });
const w2gCompiled = compileAlternativePage(watch2getherTemplate, locale, lang, '../', '');
fs.writeFileSync(path.join(altDir, 'watch2gether.html'), w2gCompiled);
}
if (hasScenerTemplate) {
const altDir = path.join(wwwDir, 'alternatives');
fs.mkdirSync(altDir, { recursive: true });
const scCompiled = compileAlternativePage(scenerTemplate, locale, lang, '../', '');
fs.writeFileSync(path.join(altDir, 'scener.html'), scCompiled);
}
if (hasKosmiTemplate) {
const altDir = path.join(wwwDir, 'alternatives');
fs.mkdirSync(altDir, { recursive: true });
const koCompiled = compileAlternativePage(kosmiTemplate, locale, lang, '../', '');
fs.writeFileSync(path.join(altDir, 'kosmi.html'), koCompiled);
}
if (hasTwosevenTemplate) {
const altDir = path.join(wwwDir, 'alternatives');
fs.mkdirSync(altDir, { recursive: true });
const tsCompiled = compileAlternativePage(twosevenTemplate, locale, lang, '../', '');
fs.writeFileSync(path.join(altDir, 'twoseven.html'), tsCompiled);
}
if (hasOverviewTemplate) {
const altDir = path.join(wwwDir, 'alternatives');
fs.mkdirSync(altDir, { recursive: true });
@@ -283,6 +474,30 @@ async function compile() {
const ssCompiled = compileAlternativePage(screenSharingTemplate, locale, lang, '../../', lang + '/');
fs.writeFileSync(path.join(langAltDir, 'screen-sharing.html'), ssCompiled);
}
if (hasWatch2getherTemplate) {
const langAltDir = path.join(langDir, 'alternatives');
fs.mkdirSync(langAltDir, { recursive: true });
const w2gCompiled = compileAlternativePage(watch2getherTemplate, locale, lang, '../../', lang + '/');
fs.writeFileSync(path.join(langAltDir, 'watch2gether.html'), w2gCompiled);
}
if (hasScenerTemplate) {
const langAltDir = path.join(langDir, 'alternatives');
fs.mkdirSync(langAltDir, { recursive: true });
const scCompiled = compileAlternativePage(scenerTemplate, locale, lang, '../../', lang + '/');
fs.writeFileSync(path.join(langAltDir, 'scener.html'), scCompiled);
}
if (hasKosmiTemplate) {
const langAltDir = path.join(langDir, 'alternatives');
fs.mkdirSync(langAltDir, { recursive: true });
const koCompiled = compileAlternativePage(kosmiTemplate, locale, lang, '../../', lang + '/');
fs.writeFileSync(path.join(langAltDir, 'kosmi.html'), koCompiled);
}
if (hasTwosevenTemplate) {
const langAltDir = path.join(langDir, 'alternatives');
fs.mkdirSync(langAltDir, { recursive: true });
const tsCompiled = compileAlternativePage(twosevenTemplate, locale, lang, '../../', lang + '/');
fs.writeFileSync(path.join(langAltDir, 'twoseven.html'), tsCompiled);
}
if (hasOverviewTemplate) {
const langAltDir = path.join(langDir, 'alternatives');
fs.mkdirSync(langAltDir, { recursive: true });
@@ -302,7 +517,8 @@ async function compile() {
{ src: 'impressum-de.html', dest: 'de/impressum.html' },
{ src: 'datenschutz-de.html', dest: 'de/datenschutz.html' },
{ src: 'impressum.html', dest: 'impressum.html' },
{ src: 'datenschutz.html', dest: 'datenschutz.html' }
{ src: 'datenschutz.html', dest: 'datenschutz.html' },
{ src: '404.html', dest: '404.html' }
];
for (const mapping of staticMappings) {
const src = path.join(websiteDir, mapping.src);
@@ -314,20 +530,45 @@ async function compile() {
}
}
// ── 5. Copy generic static files ──
const genericFiles = ['robots.txt', 'sitemap.xml', 'site.webmanifest', 'version.json'];
// ── 5. Copy generic static files and verification files ──
const genericFiles = ['robots.txt', 'site.webmanifest', 'version.json', 'llms.txt'];
for (const file of genericFiles) {
const src = path.join(websiteDir, file);
const dest = path.join(wwwDir, file);
if (fs.existsSync(src)) { fs.copyFileSync(src, dest); }
}
// ── 5.5 Generate dynamic sitemap ──
generateSitemap(wwwDir);
// Auto-copy Google verification files and IndexNow/txt key files from website source to www root
const websiteFiles = fs.readdirSync(websiteDir);
for (const file of websiteFiles) {
const filePath = path.join(websiteDir, file);
if (fs.statSync(filePath).isFile()) {
// Match google[hex/alphanumeric].html or any hex/uuid txt file (e.g. 4650678bb36b488d8f64343a67f1b931.txt)
const isGoogleVerification = /^google[a-zA-Z0-9_-]+\.html$/i.test(file);
const isIndexNowVerification = (/^[a-zA-Z0-9_-]{8,}\.txt$/i.test(file) || /^[a-f0-9-]{32,36}$/i.test(file)) && file !== 'robots.txt';
if (isGoogleVerification || isIndexNowVerification) {
const dest = path.join(wwwDir, file);
fs.copyFileSync(filePath, dest);
console.log(` Copied verification file: ${file}${file}`);
}
}
}
// ── 6. Copy assets ──
console.log('Copying assets...');
const srcAssets = path.join(websiteDir, 'assets');
const destAssets = path.join(wwwDir, 'assets');
if (fs.existsSync(srcAssets)) {
copyDirSync(srcAssets, destAssets);
// Pages use the hashed subset staged in step 0.7; ship neither the raw
// font nor the unhashed subset artifacts
fs.rmSync(path.join(destAssets, 'TwemojiCountryFlags.woff2'), { force: true });
fs.rmSync(path.join(destAssets, 'TwemojiCountryFlags.subset.woff2'), { force: true });
fs.rmSync(path.join(destAssets, 'TwemojiCountryFlags.subset.json'), { force: true });
console.log(' Assets copied.');
}
@@ -339,43 +580,80 @@ async function compile() {
console.log(' ✓ Apple touch icons copied to www root.');
}
// ── 7. Convert all WebP to AVIF (quality 70) ──
console.log('Converting WebP → AVIF...');
let avifCount = 0;
const webpFiles = fs.readdirSync(destAssets).filter(f => f.endsWith('.webp'));
for (const f of webpFiles) {
const src = path.join(destAssets, f);
const stat = fs.statSync(src);
if (stat.size < MIN_AVIF_KB * 1024) continue;
const dest = path.join(destAssets, f.replace(/\.webp$/, '.avif'));
if (fs.existsSync(dest) && fs.statSync(dest).mtimeMs >= stat.mtimeMs) continue;
await sharp(src).avif({ quality: 80, speed: 4 }).toFile(dest);
avifCount++;
}
console.log(` ${avifCount} AVIF files generated.`);
// ── 8. Post-process ALL HTML files ──
console.log('Post-processing HTML...');
function walkHtml(dir, fn) {
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
const p = path.join(dir, entry.name);
if (entry.isDirectory()) { walkHtml(p, fn); }
else if (entry.name.endsWith('.html')) { fn(p); }
// ── 6.5 Responsive variants for the static-page mascots ──
// These pages showed 434-500px sources at 180px CSS (2x need: 360px).
// Variants feed the AVIF step below and the srcset attributes in the
// static HTML files.
console.log('Generating responsive mascot variants...');
const RESPONSIVE_VARIANTS = [
{ src: 'KoalaImprintl.webp', widths: [180, 360] },
{ src: 'KoalaPrivacy.webp', widths: [180, 360] },
{ src: 'KoalaSearching.webp', widths: [180, 360] }
];
for (const variant of RESPONSIVE_VARIANTS) {
const variantSrc = path.join(destAssets, variant.src);
if (!fs.existsSync(variantSrc)) {
throw new Error(`Responsive variant source ${variant.src} not found in assets`);
}
for (const width of variant.widths) {
const out = variantSrc.replace(/\.webp$/, `-${width}.webp`);
await sharp(variantSrc).resize({ width }).toFile(out);
}
}
walkHtml(wwwDir, (filePath) => {
// ── 7. Convert all WebP to AVIF (quality 65) ──
// Content-hash cache: mtime comparison never hit because copyDirSync
// refreshes mtimes, so every verify re-encoded all AVIFs.
console.log('Converting WebP → AVIF...');
const AVIF_OPTS = { quality: 65, speed: 4 };
const avifCachePath = path.join(websiteDir, '.avif-cache.json');
let avifCache = {};
try { avifCache = JSON.parse(fs.readFileSync(avifCachePath, 'utf8')); } catch { /* cold cache */ }
const avifCacheNext = {};
let avifCount = 0, avifCachedCount = 0;
const webpFiles = fs.readdirSync(destAssets).filter(f => f.endsWith('.webp'));
for (const f of webpFiles) {
const src = path.join(destAssets, f);
const dest = path.join(destAssets, f.replace(/\.webp$/, '.avif'));
const key = `${sha8(fs.readFileSync(src))}:q${AVIF_OPTS.quality}s${AVIF_OPTS.speed}`;
avifCacheNext[f] = key;
if (avifCache[f] === key && fs.existsSync(dest)) { avifCachedCount++; continue; }
await sharp(src).avif(AVIF_OPTS).toFile(dest);
avifCount++;
}
fs.writeFileSync(avifCachePath, JSON.stringify(avifCacheNext, null, 2) + '\n');
console.log(` ${avifCount} AVIF files generated, ${avifCachedCount} unchanged (cache).`);
// ── 8. Post-process ALL HTML files ──
console.log('Post-processing HTML...');
async function walkHtml(dir, fn) {
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
const p = path.join(dir, entry.name);
if (entry.isDirectory()) { await walkHtml(p, fn); }
else if (entry.name.endsWith('.html')) { await fn(p); }
}
}
await walkHtml(wwwDir, async (filePath) => {
let html = fs.readFileSync(filePath, 'utf8');
// 8a. Replace hashed asset refs
html = html.replace(/href="((?:\.\.\/)*)style\.min\.css"/g, (m, prefix) => {
return `href="${prefix}${styleName}"`;
// 8a. Replace hashed asset refs and inject SRI (Subresource Integrity)
// The prefix is either any number of "../" segments or a single "/"
// (404.html must use absolute paths: it is served for arbitrary URLs).
html = html.replace(/(<link\b[^>]*?\bhref=")((?:\.\.\/)*\/?)style\.min\.css"/g, (m, before, prefix) => {
return `${before}${prefix}${styleName}" integrity="${styleSRI}" crossorigin="anonymous"`;
});
html = html.replace(/src="((?:\.\.\/)*)app\.min\.js"/g, (m, prefix) => {
return `src="${prefix}${appName}"`;
for (const bundle of compiledLandingBundles) {
const placeholder = bundle.key === 'landing' ? 'landing.min.css' : `landing-${bundle.key}.min.css`;
html = html.replace(new RegExp(`(<link\\b[^>]*?\\bhref=")((?:\\.\\.\\/)*\\/?)${placeholder.replaceAll('.', '\\.') }"`, 'g'), (m, before, prefix) => {
return `${before}${prefix}${bundle.name}" integrity="${bundle.sri}" crossorigin="anonymous"`;
});
}
html = html.replace(/(<script\b[^>]*?\bsrc=")((?:\.\.\/)*\/?)app\.min\.js"/g, (m, before, prefix) => {
return `${before}${prefix}${appName}" integrity="${appSRI}" crossorigin="anonymous"`;
});
html = html.replace(/src="((?:\.\.\/)*)lang-init\.min\.js"/g, (m, prefix) => {
return `src="${prefix}${langName}"`;
html = html.replace(/(<script\b[^>]*?\bsrc=")((?:\.\.\/)*\/?)lang-init\.min\.js"/g, (m, before, prefix) => {
return `${before}${prefix}${langName}" integrity="${langSRI}" crossorigin="anonymous"`;
});
// 8b. Inject AVIF <picture> wrappers
@@ -384,10 +662,119 @@ async function compile() {
// 8c. Minify inline SVGs
html = minifyInlineSvgs(html);
// 8d. Preload the subset flag font on pages that show flags. This
// cuts the HTML→CSS→font chain; unicode-range alone would delay the
// request until after CSS parse + layout.
if (/[\u{1F1E6}-\u{1F1FF}]{2}/u.test(html)) {
const relDir = path.relative(wwwDir, path.dirname(filePath));
// 404.html is served for arbitrary URLs and must use absolute paths
const prefix = path.basename(filePath) === '404.html'
? '/'
: (relDir ? '../'.repeat(relDir.split(path.sep).length) : '');
const preload = `<link rel="preload" as="font" type="font/woff2" href="${prefix}assets/${flagFontName}" crossorigin>`;
html = html.replace('</head>', `${preload}\n</head>`);
}
// 8e. Minify HTML (comments + indentation)
html = await minifyHTML(html);
fs.writeFileSync(filePath, html);
});
console.log('KoalaSync build finished successfully! Output: website/www/');
}
function generateSitemap(wwwDir) {
const languages = [
{ code: 'en', prefix: '', hreflang: 'en' },
{ code: 'de', prefix: 'de/', hreflang: 'de' },
{ code: 'fr', prefix: 'fr/', hreflang: 'fr' },
{ code: 'es', prefix: 'es/', hreflang: 'es' },
{ code: 'pt-BR', prefix: 'pt-BR/', hreflang: 'pt-br' },
{ code: 'ru', prefix: 'ru/', hreflang: 'ru' },
{ code: 'it', prefix: 'it/', hreflang: 'it' },
{ code: 'pl', prefix: 'pl/', hreflang: 'pl' },
{ code: 'tr', prefix: 'tr/', hreflang: 'tr' },
{ code: 'nl', prefix: 'nl/', hreflang: 'nl' },
{ code: 'ja', prefix: 'ja/', hreflang: 'ja' },
{ code: 'ko', prefix: 'ko/', hreflang: 'ko' },
{ code: 'zh', prefix: 'zh/', hreflang: 'zh' },
{ code: 'uk', prefix: 'uk/', hreflang: 'uk' },
{ code: 'pt', prefix: 'pt/', hreflang: 'pt' }
];
const today = new Date().toISOString().split('T')[0];
let xml = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">`;
// Static legal pages
xml += `
<url>
<loc>https://sync.koalastuff.net/imprint</loc>
<lastmod>${today}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://sync.koalastuff.net/privacy</loc>
<lastmod>${today}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://sync.koalastuff.net/de/impressum</loc>
<lastmod>${today}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://sync.koalastuff.net/de/datenschutz</loc>
<lastmod>${today}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.3</priority>
</url>`;
function addPage(relativePath, changefreq, priority) {
for (const lang of languages) {
const loc = `https://sync.koalastuff.net/${lang.prefix}${relativePath}`;
xml += `
<url>
<loc>${loc}</loc>
<lastmod>${today}</lastmod>
<changefreq>${changefreq}</changefreq>
<priority>${priority}</priority>`;
for (const alt of languages) {
const altHref = `https://sync.koalastuff.net/${alt.prefix}${relativePath}`;
xml += `
<xhtml:link rel="alternate" hreflang="${alt.hreflang}" href="${altHref}"/>`;
}
const defaultHref = `https://sync.koalastuff.net/${relativePath}`;
xml += `
<xhtml:link rel="alternate" hreflang="x-default" href="${defaultHref}"/>
</url>`;
}
}
addPage('', 'weekly', '1.0');
addPage('alternatives', 'weekly', '0.7');
const subpages = [
'alternatives/teleparty',
'alternatives/screen-sharing',
'alternatives/watch2gether',
'alternatives/scener',
'alternatives/kosmi',
'alternatives/twoseven'
];
for (const sub of subpages) {
addPage(sub, 'weekly', '0.7');
}
xml += `\n</urlset>\n`;
fs.writeFileSync(path.join(wwwDir, 'sitemap.xml'), xml.trim() + '\n', 'utf8');
console.log(' ✓ Dynamically generated sitemap.xml with current date');
}
compile().catch(err => { console.error('Build failed:', err); process.exit(1); });
+162 -23
View File
@@ -25,24 +25,103 @@
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Datenschutzerklärung",
"url": "https://sync.koalastuff.net/de/datenschutz",
"description": "Datenschutzerklärung von KoalaSync - Wir nehmen Datenschutz ernst. Erfahre mehr über unseren Ansatz ohne Tracking, ohne Logs und ohne Cookies.",
"inLanguage": "de",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/de/"
}
}
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#0f172a">
<meta name="theme-color" content="#10190e">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="../lang-init.min.js"></script>
</head>
<body>
<div class="bg-blobs">
<div class="blob blob-1"></div>
<div class="blob blob-2"></div>
<div class="blob blob-3"></div>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
<div class="container nav-content">
<a href="./" class="logo-area" style="text-decoration: none;">
<img src="../assets/NewLogoIcon.webp" alt="KoalaSync Logo" width="40" height="40">
<img src="../assets/NewLogoIcon_128.webp" alt="KoalaSync Logo" width="40" height="40">
<span>KoalaSync</span>
</a>
<div class="nav-links">
@@ -82,7 +161,7 @@
<main class="legal-content">
<div class="legal-card" data-reveal style="padding: 2rem;">
<div style="display: flex; justify-content: center;">
<img src="../assets/KoalaPrivacy.webp" alt="Niedlicher Koala, der den Datenschutz repräsentiert" class="legal-mascot" width="180" height="180">
<img src="../assets/KoalaPrivacy-180.webp" srcset="../assets/KoalaPrivacy-180.webp 180w, ../assets/KoalaPrivacy-360.webp 360w" sizes="180px" alt="Niedlicher Koala, der den Datenschutz repräsentiert" class="legal-mascot" width="180" height="180">
</div>
<h1>Datenschutz</h1>
<p style="text-align: center; text-transform: uppercase; letter-spacing: 0.1em; font-size: 0.8rem; border-bottom: 1px solid var(--glass-border); padding-bottom: 1.5rem; margin-bottom: 2rem;">
@@ -90,14 +169,28 @@
</p>
<section>
<h2>1. Hosting & Logfiles</h2>
<h2>1. Kontakt</h2>
<p>
Diese Seite wird auf einem privaten Server gehostet. Zur Gewährleistung der Stabilität werden standardmäßige Server-Logs (IP, Browser, Zeit) erhoben, aber nicht mit Personen verknüpft und nach 7 Tagen automatisch gelöscht.
KoalaSync wird von Timo Schmidt betrieben.<br>
Für datenschutzbezogene Fragen: <span class="email-reveal" data-user="koalasync" data-domain="koalastuff.net" style="color: var(--accent); cursor: pointer; text-decoration: underline;">[E-Mail anzeigen]</span>
</p>
</section>
<section>
<h2>2. Keine Drittanbieter & Open Source</h2>
<h2>2. Website-Hosting & Access Logs</h2>
<p>
KoalaSync wird auf Infrastruktur der Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, Deutschland, gehostet. Der Serverstandort ist Finnland und damit innerhalb der EU/des EWR. Mit Hetzner besteht ein Auftragsverarbeitungsvertrag gemäß Art. 28 DSGVO.
</p>
<p style="margin-top: 0.5rem;">
Beim Aufruf dieser Website können Standard-Access-Logs Ihre IP-Adresse, Browser/User-Agent und Zeitpunkt enthalten. Diese Logs werden ausschließlich für Sicherheit, Stabilität und Missbrauchsprävention verwendet und nach 7 Tagen automatisch gelöscht.
</p>
<p style="margin-top: 0.5rem;">
Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO, berechtigtes Interesse am sicheren Betrieb der Website, an Stabilität und Missbrauchsprävention.
</p>
</section>
<section>
<h2>3. Keine Drittanbieter & Open Source</h2>
<p>
KoalaSync verzichtet bewusst auf Analyse-Tools, Tracking-Cookies oder Werbenetzwerke. Wir laden keine Ressourcen von Drittanbietern (wie Google Fonts) nach, um Ihre Privatsphäre maximal zu schützen.
</p>
@@ -107,26 +200,41 @@
</section>
<section>
<h2>3. Relay-Server Architektur</h2>
<h2>4. Offizieller Relay-Server & Raumdaten</h2>
<p>
Unser Relay-Server arbeitet ausschließlich im Arbeitsspeicher (RAM). Nachrichten zwischen Teilnehmern werden nicht auf Festplatten gespeichert und sind flüchtig. Sobald ein Raum geschlossen wird, werden alle zugehörigen Metadaten sofort gelöscht. Wir tracken Sie nicht. Wir überwachen lediglich unseren Server auf Basis von aggregierten, anonymen, nicht-personenbezogenen System-Leistungsmetriken.
Der offizielle KoalaSync-Relay-Server führt keine persistenten Logs. Er speichert keine Raumhistorie, keinen Sync-Verlauf, keinen Wiedergabeverlauf, keine Raumnachrichten, keine Playback-Events, keine Tab-Titel und keine Medientitel auf Festplatte.
</p>
<p style="margin-top: 0.5rem;">
Zur Bereitstellung der Raumfunktion verarbeitet der Relay Raum- und Synchronisationsdaten temporär im Arbeitsspeicher, solange ein Raum aktiv ist. Dazu können Room-ID, Peer-ID, Anzeigename, Wiedergabestatus, Sync-Events und abhängig von den Titel-Privatsphäre-Einstellungen Tab-/Medientitel gehören. Diese Daten werden nur an Teilnehmer desselben Raums weitergeleitet und aus dem Arbeitsspeicher entfernt, wenn der Raum abläuft oder geschlossen wird.
</p>
<p style="margin-top: 0.5rem;">
Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO, berechtigtes Interesse an der Bereitstellung der gewünschten Synchronisationsfunktion, Sicherheit und Missbrauchsprävention.
</p>
<p style="margin-top: 0.5rem;">
Raum- und Peer-Zahlen sind aggregierte Betriebsmetriken zur Überwachung des Serverstatus.
</p>
</section>
<section>
<h2>4. Browser-Erweiterung (Extension)</h2>
<h2>5. Browser-Erweiterung & lokaler Speicher</h2>
<p>
Um die geräteübergreifende Synchronisation zu ermöglichen, erfasst die KoalaSync Browser-Erweiterung temporär Daten des aktuell aktiven Video-Tabs (z. B. Tab-Titel, Medien-Metadaten wie den Videotitel sowie den Wiedergabestatus). Diese Daten werden ausschließlich zur Synchronisation an die anderen Teilnehmer in Ihrem Raum gesendet. Es wird ausdrücklich <strong>kein allgemeiner Browserverlauf (Browsing History)</strong> ausgelesen, gespeichert oder übermittelt.
Zur Synchronisierung der Wiedergabe zwischen Teilnehmern desselben Raums erfasst die KoalaSync Browser-Erweiterung temporär Daten des aktuell aktiven Video-Tabs (z. B. Tab-Titel, Medien-Metadaten wie den Videotitel sowie den Wiedergabestatus). Tab- oder Medientitel können je nach Inhalt potenziell personenbezogen sein. Sie werden nur für die Synchronisationsfunktion verarbeitet, können über die Privatsphäre-Einstellungen der Erweiterung eingeschränkt oder deaktiviert werden, werden nur an Teilnehmer desselben Raums weitergeleitet und vom Relay nicht protokolliert oder dauerhaft gespeichert.
</p>
<p style="margin-top: 0.5rem;">
Die Erweiterung speichert nur für den Betrieb erforderliche Einstellungen lokal im Browser, z. B. Anzeigename, Server-URL, aktuelle Raumdaten, Sprache, Titel-Privatsphäre-Einstellungen, Benachrichtigungseinstellungen und Audio-Processing-Einstellungen. KoalaSync speichert keinen allgemeinen Browserverlauf und keinen persistenten Wiedergabeverlauf.
</p>
<p style="margin-top: 0.5rem;">
Die Erweiterung verbindet sich nur mit dem Relay-Server, während Sie sich aktiv in einem Raum befinden. Es wird keine dauerhafte Hintergrundverbindung aufrechterhalten, sodass Ihre IP-Adresse dem Server nicht offengelegt wird, wenn Sie die Erweiterung nicht nutzen.
</p>
</section>
<section>
<h2>5. Berechtigungen der Erweiterung</h2>
<h2>6. Berechtigungen der Erweiterung</h2>
<p>
Um ihre technischen Zweck zu erfüllen, benötigt die Browser-Erweiterung bestimmte Berechtigungen. Jede Berechtigung wird ausschließlich für die Kernfunktionalität genutzt:
Um ihren technischen Zweck zu erfüllen, benötigt die Browser-Erweiterung bestimmte Berechtigungen. Jede Berechtigung wird ausschließlich für die Kernfunktionalität genutzt:
</p>
<ul style="margin-left: 1.5rem; margin-top: 0.5rem; color: var(--text-muted); font-size: 0.9rem; list-style-type: disc; display: flex; flex-direction: column; gap: 0.35rem;">
<li><strong>storage</strong>: Erlaubt das lokale Speichern von Benutzernamen, Server-URLs und Raum-Zugangsdaten im Browser, damit Sie sich nicht jedes Mal neu anmelden müssen.</li>
<li><strong>storage</strong>: Ermöglicht die lokale Speicherung von Anzeigename, Server-URL, Raumdaten und Einstellungen im Browser, damit diese zwischen Sitzungen erhalten bleiben.</li>
<li><strong>tabs</strong>: Wird benötigt, um geöffnete Tabs im Dropdown der Erweiterung aufzulisten und deren Titel auszulesen, damit Sie bequem den richtigen Video-Tab auswählen können.</li>
<li><strong>scripting</strong>: Erforderlich, um das Synchronisationsskript (content.js) sicher in den von Ihnen ausgewählten Videotab zu injizieren.</li>
<li><strong>alarms</strong>: Verhindert, dass der Hintergrunddienst der Erweiterung (Service Worker) während einer aktiven Synchronisationssitzung vom Browser in den Ruhezustand versetzt wird.</li>
@@ -137,18 +245,49 @@
</section>
<section>
<h2>6. Brute-Force Schutz</h2>
<h2>7. Brute-Force & Rate-Limit-Schutz</h2>
<p>
Zur Sicherheit unserer Nutzer speichern wir fehlgeschlagene Login-Versuche (IP-Adresse und Raum-ID) für maximal 15 Minuten im RAM, um automatisierte Angriffe zu verhindern. Diese Daten werden danach rückstandslos gelöscht.
Zur Missbrauchsprävention können fehlgeschlagene Beitritts-/Login-Versuche die IP-Adresse und Room-ID für bis zu 15 Minuten im Arbeitsspeicher halten. Diese Daten werden nicht auf Festplatte geschrieben, nicht öffentlich zugänglich gemacht und automatisch gelöscht. Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO, berechtigtes Interesse an der Verhinderung von Brute-Force-Angriffen und Missbrauch.
</p>
</section>
<section>
<h2>7. Ihre Rechte</h2>
<h2>8. Empfänger & Dritte</h2>
<p>
Sie haben das Recht auf Auskunft, Berichtigung oder Löschung Ihrer Daten. Da wir jedoch keine personenbezogenen Daten dauerhaft speichern, ist eine Zuordnung zu Ihrer Person in der Regel technisch nicht möglich.
Technische Hosting- und Verbindungsdaten können durch Hetzner als Hosting-Anbieter im Auftrag des Betreibers verarbeitet werden. Raum-Synchronisationsdaten werden nur an Teilnehmer desselben Raums weitergeleitet. KoalaSync verwendet keine Analytics-Anbieter, Werbenetzwerke oder Tracking-Dienste.
</p>
</section>
<section>
<h2>9. Erforderliche & optionale Daten</h2>
<p>
Die Bereitstellung technischer Verbindungsdaten ist erforderlich, um die Website aufzurufen und den Relay zu nutzen. Raumdaten und Sync-Events sind erforderlich, um die Raumsynchronisation zu verwenden. Das Teilen von Tab-/Medientitel ist optional und kann über die Privatsphäre-Einstellungen der Erweiterung eingeschränkt werden.
</p>
</section>
<section>
<h2>10. Rechte der betroffenen Person</h2>
<p>
Nach der DSGVO können Ihnen Rechte auf Auskunft, Berichtigung, Löschung, Einschränkung der Verarbeitung, Datenübertragbarkeit, Widerspruch sowie das Recht auf Beschwerde bei einer Aufsichtsbehörde zustehen.
</p>
<p style="margin-top: 0.5rem;">
Da KoalaSync keine Nutzerkonten verwendet und keine persistenten Raumlogs oder Wiedergabeverläufe speichert, sind viele Datenpunkte entweder kurzlebig oder nach ihrer Löschung keiner bestimmten Person mehr zuordenbar. KoalaSync erhebt oder speichert außerdem keine zusätzlichen Identifikationsdaten nur um Nutzer für Betroffenenanfragen zu identifizieren.
</p>
<p style="margin-top: 0.5rem;">Kontakt für Datenschutzanfragen: <span class="email-reveal" data-user="koalasync" data-domain="koalastuff.net" style="color: var(--accent); cursor: pointer; text-decoration: underline;">[E-Mail anzeigen]</span></p>
</section>
<section>
<h2>11. Kein Profiling & automatisierte Entscheidungsfindung</h2>
<p>
KoalaSync verwendet kein Profiling und keine automatisierte Entscheidungsfindung im Sinne von Art. 22 DSGVO.
</p>
</section>
<section>
<h2>12. Drittlandstransfers</h2>
<p>
Das reguläre Hosting befindet sich innerhalb der EU/des EWR. Eine regelmäßige Übermittlung personenbezogener Daten in Drittländer findet nicht statt.
</p>
<p>Kontakt bei Fragen: <span class="email-reveal" data-user="koalasync_datenschutz" data-domain="koalamail.rocks" style="color: var(--accent); cursor: pointer; text-decoration: underline;">[E-Mail anzeigen]</span></p>
</section>
</div>
</main>
@@ -156,7 +295,7 @@
<footer>
<div class="container">
<p>&copy; 2026 KoalaSync. Open Source unter der MIT-Lizenz.</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">Keine Daten werden auf unseren Servern gespeichert. Reines RAM-basiertes Relay.</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">Keine Relay-Logs. Kein Tracking. Website-Access-Logs werden nach 7 Tagen gelöscht.</p>
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="impressum" style="color: var(--text-muted); text-decoration: none;">Impressum</a>
<a href="datenschutz" style="color: var(--text-muted); text-decoration: none;">Datenschutz</a>
+2
View File
@@ -2,6 +2,8 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noindex, follow">
<title>Redirecting...</title>
<script>
(function() {
+48
View File
@@ -0,0 +1,48 @@
/**
* Shared helpers for the country-flag font subset.
* Used by build.cjs (validation) and tools/subset-flag-font.mjs (generation).
*
* Flags are regional-indicator pairs; tag-sequence flags (🏴 England etc.)
* are NOT extracted or subset if one is ever added it will render via the
* system emoji font.
*/
const fs = require('fs');
const path = require('path');
const FLAG_PAIR_RE = /[\u{1F1E6}-\u{1F1FF}]{2}/gu;
function collectFlagSourceFiles(websiteDir) {
const files = [];
for (const entry of fs.readdirSync(websiteDir)) {
if (entry.endsWith('.html')) files.push(path.join(websiteDir, entry));
}
for (const dir of ['alternatives', 'locales']) {
const p = path.join(websiteDir, dir);
if (!fs.existsSync(p)) continue;
for (const entry of fs.readdirSync(p)) {
if (/\.(html|json)$/.test(entry)) files.push(path.join(p, entry));
}
}
return files;
}
function extractUsedFlags(files) {
const flags = new Set();
for (const file of files) {
for (const m of fs.readFileSync(file, 'utf8').matchAll(FLAG_PAIR_RE)) {
flags.add(m[0]);
}
}
return [...flags].sort();
}
// 🇩🇪 → "DE" (for readable manifests and tool output)
function flagToCountryCode(flag) {
return [...flag].map(c => String.fromCharCode(c.codePointAt(0) - 0x1F1E6 + 65)).join('');
}
function countryCodeToFlag(code) {
return [...code].map(c => String.fromCodePoint(0x1F1E6 + c.charCodeAt(0) - 65)).join('');
}
module.exports = { FLAG_PAIR_RE, collectFlagSourceFiles, extractUsedFlags, flagToCountryCode, countryCodeToFlag };
+1
View File
@@ -0,0 +1 @@
google-site-verification: google157cb8453d13ccdc.html
+117 -28
View File
@@ -25,24 +25,103 @@
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Impressum",
"url": "https://sync.koalastuff.net/de/impressum",
"description": "Impressum (Legal Notice) von KoalaSync - Anbieterkennzeichnung und Kontaktinformationen für die Open-Source Video-Synchronisations-Erweiterung.",
"inLanguage": "de",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/de/"
}
}
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#0f172a">
<meta name="theme-color" content="#10190e">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="../lang-init.min.js"></script>
</head>
<body>
<div class="bg-blobs">
<div class="blob blob-1"></div>
<div class="blob blob-2"></div>
<div class="blob blob-3"></div>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
<div class="container nav-content">
<a href="./" class="logo-area" style="text-decoration: none;">
<img src="../assets/NewLogoIcon.webp" alt="KoalaSync Logo" width="40" height="40">
<img src="../assets/NewLogoIcon_128.webp" alt="KoalaSync Logo" width="40" height="40">
<span>KoalaSync</span>
</a>
<div class="nav-links">
@@ -82,59 +161,69 @@
<main class="legal-content">
<div class="legal-card" data-reveal style="padding: 2rem;">
<div style="display: flex; justify-content: center;">
<img src="../assets/KoalaImprintl.webp" alt="Niedlicher Koala, der das Impressum repräsentiert" class="legal-mascot" width="180" height="180">
<img src="../assets/KoalaImprintl-180.webp" srcset="../assets/KoalaImprintl-180.webp 180w, ../assets/KoalaImprintl-360.webp 360w" sizes="180px" alt="Niedlicher Koala, der das Impressum repräsentiert" class="legal-mascot" width="180" height="180">
</div>
<h1>Impressum</h1>
<h1>Impressum / Anbieterinformationen</h1>
<p style="text-align: center; text-transform: uppercase; letter-spacing: 0.1em; font-size: 0.8rem; border-bottom: 1px solid var(--glass-border); padding-bottom: 1.5rem; margin-bottom: 2rem;">
Transparenz & Identifikation
Kontakt & Projektinformationen
</p>
<section>
<h2>Betreiber & Kontakt</h2>
<p>Timo (KoalaDev) Privatperson</p>
<p>Timo Schmidt</p>
<p style="margin-top: 0.5rem;">
E-Mail: <span class="email-reveal" data-user="koalasync_admin" data-domain="koalamail.rocks" style="color: var(--accent); cursor: pointer; text-decoration: underline;">[E-Mail anzeigen]</span>
E-Mail: <span class="email-reveal" data-user="koalasync" data-domain="koalastuff.net" style="color: var(--accent); cursor: pointer; text-decoration: underline;">[E-Mail anzeigen]</span>
</p>
<p style="margin-top: 0.75rem;">
<span style="opacity: 0.6;">🔒 Private Nachricht:</span>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" style="color: var(--accent); text-decoration: none;">@koalastuff auf Mastodon</a>
<span class="legal-inline-label">🔒 Private Nachricht:</span>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" class="legal-inline-link">@koalastuff auf Mastodon</a>
</p>
<p style="margin-top: 0.5rem;">
<span style="opacity: 0.6;">🐛 Active Bedenken / Bug Reports:</span>
<a href="https://github.com/Shik3i/KoalaSync/issues" target="_blank" rel="noopener" style="color: var(--accent); text-decoration: none;">GitHub Issues</a>
<span class="legal-inline-label">🐛 Fehlerberichte und Sicherheitsmeldungen:</span>
<a href="https://github.com/Shik3i/KoalaSync/issues" target="_blank" rel="noopener" class="legal-inline-link">GitHub Issues</a>
</p>
</section>
<section style="opacity: 0.8;">
<h2>Privatprojekt-Hinweis</h2>
<section>
<h2>Projektinformationen</h2>
<p>
Diese Website ist ein rein privates Hobby-Projekt und dient keinen geschäftsmäßigen Zwecken.
Eine Impressumspflicht nach § 5 DDG (ehemals TMG) besteht daher nicht.
Diese Angaben erfolgen rein freiwillig zur Transparenz gegenüber der Community.
KoalaSync ist eine kostenlose und quelloffene Browser-Erweiterung. Der Quellcode ist auf GitHub unter der MIT-Lizenz verfügbar.
</p>
<p style="margin-top: 0.5rem;">
Informationen zum Datenschutz, einschließlich Hosting, Access Logs, Relay-Verhalten und Betroffenenrechten, finden Sie in der <a href="datenschutz" class="legal-inline-link">Datenschutzerklärung</a>.
</p>
</section>
<section>
<h2>Haftung für Inhalte</h2>
<p>
Gemäß § 7 Abs.1 DDG sind wir für eigene Inhalte verantwortlich. Nach §§ 8 bis 10 DDG sind wir jedoch nicht verpflichtet,
übermittelte oder gespeicherte fremde Informationen zu überwachen.
Die Inhalte dieser Website wurden mit Sorgfalt erstellt. Ich kann jedoch nicht gewährleisten, dass alle Informationen jederzeit vollständig, richtig oder aktuell sind.
</p>
<p style="margin-top: 0.5rem;">
Als Diensteanbieter bin ich nach den allgemeinen Gesetzen für eigene Inhalte auf diesen Seiten verantwortlich.
</p>
</section>
<section>
<h2>Haftung für Links</h2>
<p>
Unser Angebot enthält Links zu externen Websites Dritter. Auf deren Inhalte haben wir keinen Einfluss und
können daher keine Gewähr für diese fremden Inhalte übernehmen.
Diese Website enthält Links zu externen Websites Dritter. Auf deren Inhalte habe ich keinen Einfluss. Für die Inhalte verlinkter Seiten ist der jeweilige Anbieter oder Betreiber verantwortlich.
</p>
<p style="margin-top: 0.5rem;">
Wenn mir rechtswidrige Inhalte auf verlinkten Seiten bekannt werden, entferne ich die entsprechenden Links.
</p>
</section>
<section>
<h2>Urheberrecht</h2>
<h2>Lizenz & Urheberrecht</h2>
<p>
Die durch die Seitenbetreiber erstellten Inhalte auf diesen Seiten unterliegen dem deutschen Urheberrecht.
Vervielfältigung, Bearbeitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung.
KoalaSync ist freie und quelloffene Software. Sofern nicht anders angegeben, steht der Quellcode von KoalaSync unter der MIT-Lizenz.
</p>
<p style="margin-top: 0.5rem;">
Die MIT-Lizenz erlaubt Nutzung, Vervielfältigung, Bearbeitung, Verbreitung, Unterlizenzierung und Verkauf der Software, sofern der Copyright-Hinweis und der Lizenztext entsprechend den Lizenzbedingungen erhalten bleiben.
</p>
<p style="margin-top: 0.5rem;">
Projektname, Logos, Grafiken, Website-Texte und andere Nicht-Code-Assets können separaten Rechten unterliegen, sofern sie nicht ausdrücklich von der Repository-Lizenz umfasst sind.
</p>
</section>
</div>
@@ -143,7 +232,7 @@
<footer>
<div class="container">
<p>&copy; 2026 KoalaSync. Open Source unter der MIT-Lizenz.</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">Keine Daten werden auf unseren Servern gespeichert. Reines RAM-basiertes Relay.</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">Keine Relay-Logs. Kein Tracking. Website-Access-Logs werden nach 7 Tagen gelöscht.</p>
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="impressum" style="color: var(--text-muted); text-decoration: none;">Impressum</a>
<a href="datenschutz" style="color: var(--text-muted); text-decoration: none;">Datenschutz</a>
+2
View File
@@ -2,6 +2,8 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noindex, follow">
<title>Redirecting...</title>
<script>
(function() {
+116 -25
View File
@@ -25,24 +25,103 @@
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Legal Notice",
"url": "https://sync.koalastuff.net/imprint",
"description": "Legal Notice (Impressum) of KoalaSync - Contact information and operator details for the open-source video synchronization extension.",
"inLanguage": "en",
"isPartOf": {
"@type": "WebSite",
"name": "KoalaSync",
"url": "https://sync.koalastuff.net/"
}
}
</script>
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#0f172a">
<meta name="theme-color" content="#10190e">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="lang-init.min.js"></script>
</head>
<body>
<div class="bg-blobs">
<div class="blob blob-1"></div>
<div class="blob blob-2"></div>
<div class="blob blob-3"></div>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
<div class="container nav-content">
<a href="./" class="logo-area" style="text-decoration: none;">
<img src="assets/NewLogoIcon.webp" alt="KoalaSync Logo" width="40" height="40">
<img src="assets/NewLogoIcon_128.webp" alt="KoalaSync Logo" width="40" height="40">
<span>KoalaSync</span>
</a>
<div class="nav-links">
@@ -82,57 +161,69 @@
<main class="legal-content">
<div class="legal-card" data-reveal style="padding: 2rem;">
<div style="display: flex; justify-content: center;">
<img src="assets/KoalaImprintl.webp" alt="Cute Koala representing the legal notice page" class="legal-mascot" width="180" height="180">
<img src="assets/KoalaImprintl-180.webp" srcset="assets/KoalaImprintl-180.webp 180w, assets/KoalaImprintl-360.webp 360w" sizes="180px" alt="Cute Koala representing the legal notice page" class="legal-mascot" width="180" height="180">
</div>
<h1>Legal Notice</h1>
<p style="text-align: center; text-transform: uppercase; letter-spacing: 0.1em; font-size: 0.8rem; border-bottom: 1px solid var(--glass-border); padding-bottom: 1.5rem; margin-bottom: 2rem;">
Transparency & Identification
Contact & Project Information
</p>
<section>
<h2>Operator & Contact</h2>
<p>Timo (KoalaDev) Private Individual</p>
<p>Timo Schmidt</p>
<p style="margin-top: 0.5rem;">
E-Mail: <span class="email-reveal" data-user="koalasync_admin" data-domain="koalamail.rocks" style="color: var(--accent); cursor: pointer; text-decoration: underline;">[Show Email]</span>
E-Mail: <span class="email-reveal" data-user="koalasync" data-domain="koalastuff.net" style="color: var(--accent); cursor: pointer; text-decoration: underline;">[Show Email]</span>
</p>
<p style="margin-top: 0.75rem;">
<span style="opacity: 0.6;">🔒 Private message:</span>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" style="color: var(--accent); text-decoration: none;">@koalastuff on Mastodon</a>
<span class="legal-inline-label">🔒 Private message:</span>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" class="legal-inline-link">@koalastuff on Mastodon</a>
</p>
<p style="margin-top: 0.5rem;">
<span style="opacity: 0.6;">🐛 Active concerns / Bug reports:</span>
<a href="https://github.com/Shik3i/KoalaSync/issues" target="_blank" rel="noopener" style="color: var(--accent); text-decoration: none;">GitHub Issues</a>
<span class="legal-inline-label">🐛 Bug reports and security concerns:</span>
<a href="https://github.com/Shik3i/KoalaSync/issues" target="_blank" rel="noopener" class="legal-inline-link">GitHub Issues</a>
</p>
</section>
<section style="opacity: 0.8;">
<h2>Private Project Notice</h2>
<section>
<h2>Project Information</h2>
<p>
This website is a purely private hobby project and does not serve any commercial purposes.
Therefore, there is no obligation to provide a legal notice according to § 5 DDG (formerly TMG).
This information is provided voluntarily for transparency towards the community.
KoalaSync is a free and open-source browser extension. The source code is available on GitHub under the MIT License.
</p>
<p style="margin-top: 0.5rem;">
For privacy-related information, including hosting, access logs, relay behavior, and data subject rights, please see the <a href="privacy" class="legal-inline-link">Privacy Policy</a>.
</p>
</section>
<section>
<h2>Liability for Content</h2>
<p>
According to § 7 Abs.1 DDG we are responsible for our own content. According to §§ 8 to 10 DDG, however, we are not obligated to monitor transmitted or stored third-party information.
The contents of this website were created with care. However, I cannot guarantee that all information is always complete, accurate, or up to date.
</p>
<p style="margin-top: 0.5rem;">
As a service provider, I am responsible for my own content on these pages in accordance with the general laws.
</p>
</section>
<section>
<h2>Liability for Links</h2>
<p>
Our offer contains links to external third-party websites. We have no influence on their content and therefore cannot assume any liability for these external contents.
This website contains links to external third-party websites. I have no influence over the content of those websites. The respective provider or operator is responsible for the content of linked pages.
</p>
<p style="margin-top: 0.5rem;">
If I become aware of unlawful content on linked pages, I will remove the corresponding links.
</p>
</section>
<section>
<h2>Copyright</h2>
<h2>License & Copyright</h2>
<p>
The content and works created by the site operators on these pages are subject to German copyright law.
Duplication, processing, and any kind of exploitation outside the limits of copyright require written consent.
KoalaSync is free and open-source software. Unless otherwise stated, the KoalaSync source code is licensed under the MIT License.
</p>
<p style="margin-top: 0.5rem;">
The MIT License allows use, copying, modification, distribution, sublicensing, and sale of the software, provided that the copyright notice and license text are included where required by the license.
</p>
<p style="margin-top: 0.5rem;">
Project name, logos, graphics, website text, and other non-code assets may be subject to separate rights unless they are explicitly included under the repository license.
</p>
</section>
</div>
@@ -141,7 +232,7 @@
<footer>
<div class="container">
<p>&copy; 2026 KoalaSync. Open source under the MIT License.</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">No data is stored on our servers. Pure RAM-based relay.</p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;">No relay logs. No tracking. Website access logs are deleted after 7 days.</p>
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="imprint" style="color: var(--text-muted); text-decoration: none;">Legal Notice</a>
<a href="privacy" style="color: var(--text-muted); text-decoration: none;">Privacy Policy</a>
+92 -17
View File
@@ -9,6 +9,8 @@
<link rel="icon" type="image/png" sizes="16x16" href="assets/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicon-32x32.png">
<link rel="apple-touch-icon" sizes="180x180" href="assets/icon-192x192.png">
<meta name="description" content="Join a KoalaSync room invitation and start watching videos in sync with friends. No account needed.">
<link rel="canonical" href="https://sync.koalastuff.net/join">
<meta name="robots" content="noindex">
<!-- Open Graph / Facebook -->
@@ -16,35 +18,98 @@
<meta property="og:url" content="https://sync.koalastuff.net/join">
<meta property="og:title" content="Join Room | KoalaSync">
<meta property="og:description" content="You've been invited to watch videos together in perfect sync with your friends on KoalaSync.">
<meta property="og:image" content="https://sync.koalastuff.net/assets/PlatformJuggler_New.webp">
<meta property="og:image" content="https://sync.koalastuff.net/assets/og-image.png">
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Join Room | KoalaSync">
<meta name="twitter:description" content="You've been invited to watch videos together in perfect sync with your friends on KoalaSync.">
<meta name="twitter:image" content="https://sync.koalastuff.net/assets/PlatformJuggler_New.webp">
<meta name="twitter:image" content="https://sync.koalastuff.net/assets/og-image.png">
<!-- Mobile Browser Theme Styling -->
<meta name="theme-color" content="#0f172a">
<meta name="theme-color" content="#10190e">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<script src="lang-init.min.js"></script>
</head>
<body>
<div class="bg-blobs">
<div class="blob blob-1"></div>
<div class="blob blob-2"></div>
<div class="blob blob-3"></div>
<div class="bg-nature" aria-hidden="true">
<div class="bg-dusk-tint"></div>
<div class="bg-depth-day">
<div class="bg-godrays">
<span class="godray godray-1"></span>
<span class="godray godray-2"></span>
<span class="godray godray-3"></span>
</div>
<div class="bg-canopy"></div>
<span class="canopy-arc canopy-arc-1"></span>
<span class="canopy-arc canopy-arc-2"></span>
<span class="canopy-arc canopy-arc-3"></span>
<span class="canopy-arc canopy-arc-4"></span>
</div>
<div id="bamboo-far">
<span class="bamboo-stalk far-1"></span>
<span class="bamboo-stalk far-2"></span>
<span class="bamboo-stalk far-3"></span>
<span class="bamboo-stalk far-4"></span>
<span class="bamboo-stalk far-5"></span>
</div>
<div id="bamboo-near">
<div class="bamboo-stalk near-1">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
<i class="bamboo-leaf leaf-2"></i>
</div>
<div class="bamboo-stalk near-2">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
<div class="bamboo-stalk near-3">
<i class="bamboo-node node-1"></i>
<i class="bamboo-node node-2"></i>
<i class="bamboo-node node-3"></i>
<i class="bamboo-leaf leaf-1"></i>
</div>
</div>
<span class="fall-leaf fall-leaf-1"><i></i></span>
<span class="fall-leaf fall-leaf-2"><i></i></span>
<span class="fall-leaf fall-leaf-3"><i></i></span>
<span class="fall-leaf fall-leaf-4"><i></i></span>
<span class="fall-leaf fall-leaf-5"><i></i></span>
<span class="fall-leaf fall-leaf-6"><i></i></span>
<span class="fall-leaf fall-leaf-7"><i></i></span>
<span class="fall-leaf fall-leaf-8"><i></i></span>
<span class="bg-grass bg-grass-1"></span>
<span class="bg-grass bg-grass-2"></span>
<span class="bg-grass bg-grass-3"></span>
<span class="bg-grass bg-grass-4"></span>
<div class="bg-depth-dusk">
<div class="bg-mist bg-mist-1"></div>
<div class="bg-mist bg-mist-2"></div>
<div class="bg-horizon"></div>
<span class="firefly-wrap fw-1"><span class="firefly"></span></span>
<span class="firefly-wrap fw-2"><span class="firefly"></span></span>
<span class="firefly-wrap fw-3"><span class="firefly"></span></span>
<span class="firefly-wrap fw-4"><span class="firefly"></span></span>
<span class="firefly-wrap fw-5"><span class="firefly"></span></span>
<span class="firefly-wrap fw-6"><span class="firefly"></span></span>
</div>
<div class="bg-light-sweep"></div>
<div class="bg-grain"></div>
</div>
<nav>
<div class="container nav-content">
<a href="./" class="logo-area" style="text-decoration: none;">
<img src="assets/NewLogoIcon.webp" alt="KoalaSync Logo" width="64" height="64">
<img src="assets/NewLogoIcon_128.webp" alt="KoalaSync Logo" width="64" height="64">
<span>KoalaSync</span>
</a>
<div class="nav-links">
<div class="nav-links" id="primary-nav" role="navigation" aria-label="Primary">
<a href="./" style="display: inline-flex; align-items: center; gap: 6px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="width: 16px; height: 16px; display: block;"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>
<span lang="de">Startseite</span><span lang="en">Home</span>
@@ -55,6 +120,10 @@
</a>
</div>
<div class="nav-right">
<button class="theme-toggle" id="theme-toggle" type="button" aria-label="Toggle light/dark mode" title="Toggle light/dark mode">
<svg class="theme-icon-sun" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="18" height="18" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></svg>
<svg class="theme-icon-moon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="18" height="18" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg>
</button>
<div class="lang-select-container">
<select class="lang-dropdown" aria-label="Select Language">
<option value="en">🇬🇧 English</option>
@@ -73,7 +142,7 @@
</select>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="chevron-icon"><polyline points="6 9 12 15 18 9"/></svg>
</div>
<button class="hamburger" aria-label="Menu" aria-expanded="false"></button>
<button class="hamburger" aria-label="Menu" aria-expanded="false" aria-controls="primary-nav"></button>
</div>
</div>
</nav>
@@ -86,8 +155,8 @@
<div class="join-status-visual">
<div class="status-ring active-pulse" id="status-ring"></div>
<div id="join-status-icon" style="z-index: 2; transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); display: flex; align-items: center; justify-content: center;">
<img src="assets/KoalaSearching.webp" alt="A cute koala looking through a telescope searching for your extension" class="join-status-mascot searching-mascot join-status-pulse" lang="en">
<img src="assets/KoalaSearching.webp" alt="Ein niedlicher Koala schaut durch ein Fernrohr und sucht nach deiner Erweiterung" class="join-status-mascot searching-mascot join-status-pulse" lang="de">
<img src="assets/KoalaSearching-180.webp" srcset="assets/KoalaSearching-180.webp 180w, assets/KoalaSearching-360.webp 360w" sizes="175px" alt="A cute koala looking through a telescope searching for your extension" class="join-status-mascot searching-mascot join-status-pulse" lang="en">
<img src="assets/KoalaSearching-180.webp" srcset="assets/KoalaSearching-180.webp 180w, assets/KoalaSearching-360.webp 360w" sizes="175px" alt="Ein niedlicher Koala schaut durch ein Fernrohr und sucht nach deiner Erweiterung" class="join-status-mascot searching-mascot join-status-pulse" lang="de">
</div>
</div>
@@ -113,13 +182,19 @@
<footer>
<div class="container">
<p>&copy; 2026 KoalaSync. Open source under the MIT License.</p>
<p lang="en" style="font-size: 0.8rem; margin-top: 0.5rem;">No data is stored on our servers. Pure RAM-based relay.</p>
<p lang="de" style="font-size: 0.8rem; margin-top: 0.5rem;">Keine Daten werden auf unseren Servern gespeichert. Reines RAM-basiertes Relay.</p>
<p>&copy; 2026 KoalaSync. <span lang="en">Open source under the MIT License.</span><span lang="de">Open Source unter der MIT-Lizenz.</span></p>
<p style="font-size: 0.8rem; margin-top: 0.5rem;"><span lang="en">No relay logs. No tracking. Website access logs are deleted after 7 days.</span><span lang="de">Keine Relay-Logs. Kein Tracking. Website-Access-Logs werden nach 7 Tagen gelöscht.</span></p>
<p class="footer-disclaimer" style="margin-top: 1.2rem;"><span lang="en">KoalaSync is not affiliated with, endorsed by, or associated with Netflix, Disney+, Amazon, YouTube, Twitch, or any other streaming platform. All trademarks are property of their respective owners.</span><span lang="de">KoalaSync ist nicht mit Netflix, Disney+, Amazon, YouTube, Twitch oder anderen Streaming-Plattformen verbunden, wird von diesen nicht unterstützt oder steht in keiner Beziehung zu diesen. Alle Markenrechte liegen bei ihren jeweiligen Inhabern.</span></p>
<div style="margin-top: 1.5rem; font-size: 0.8rem; display: flex; justify-content: center; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
<a href="impressum" style="color: var(--text-muted); text-decoration: none;"><span lang="en">Legal Notice</span><span lang="de">Impressum</span></a>
<a href="datenschutz" style="color: var(--text-muted); text-decoration: none;"><span lang="en">Privacy Policy</span><span lang="de">Datenschutz</span></a>
<a href="imprint" lang="en" style="color: var(--text-muted); text-decoration: none;">Legal Notice</a>
<a href="de/impressum" lang="de" style="color: var(--text-muted); text-decoration: none;">Impressum</a>
<a href="privacy" lang="en" style="color: var(--text-muted); text-decoration: none;">Privacy Policy</a>
<a href="de/datenschutz" lang="de" style="color: var(--text-muted); text-decoration: none;">Datenschutz</a>
<a href="alternatives"><span lang="en">Guides & comparisons</span><span lang="de">Vergleiche & Anleitungen</span></a>
<a href="https://support.koalastuff.net" target="_blank" rel="noopener" title="Support KoalaSync" style="color: #fff; text-decoration: none; display: inline-flex; align-items: center; gap: 6px; background: #b94642; border: 1px solid rgba(255,255,255,0.18); border-radius: 999px; padding: 3px 9px; font-size: 0.72rem; font-weight: 700; line-height: 1;">
<span aria-hidden="true"></span>
<span>Support KoalaSync</span>
</a>
<a href="https://mastodon.social/@koalastuff" rel="me noopener" target="_blank" style="color: var(--text-muted); text-decoration: none; display: inline-flex; align-items: center; gap: 4px;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="14" height="14" aria-hidden="true" style="display: block;"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z"/></svg>
Mastodon
+17 -9
View File
@@ -10,14 +10,24 @@
}
};
var safeSetLocalStorage = function(key, val) {
var getSystemTheme = function() {
try {
localStorage.setItem(key, val);
return window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';
} catch (_) {
return;
return 'dark';
}
};
// Apply the effective theme before first paint. A saved preference wins;
// otherwise first-time visitors follow their browser/system setting.
var savedTheme = safeGetLocalStorage('koala_theme');
var effectiveTheme = savedTheme === 'light' || savedTheme === 'dark' ? savedTheme : getSystemTheme();
if (effectiveTheme === 'light') {
html.classList.add('theme-light');
} else {
html.classList.remove('theme-light');
}
// Mapping of browser language codes to KoalaSync locale directories
var langMap = {
'de': 'de',
@@ -72,10 +82,8 @@
}
if (hasStaticLang) {
var isLegal = path.indexOf('impressum') !== -1 || path.indexOf('datenschutz') !== -1 || path.indexOf('imprint') !== -1 || path.indexOf('privacy') !== -1;
if (!isLegal) {
safeSetLocalStorage('koala_lang', activeLang);
}
// Do not persist a static page language merely because the visitor landed
// there. The explicit dropdown handler in app.js owns language preference.
} else {
var savedLang = safeGetLocalStorage('koala_lang');
var browserLang = getBrowserLang();
@@ -97,8 +105,8 @@
if (isIndex) {
var titles = {
en: 'KoalaSync | Real-time Video Synchronization for Friends',
de: 'KoalaSync | Echtzeit-Video-Synchronisation für Freunde'
en: 'KoalaSync | Watch Party for Netflix, YouTube & Any Video',
de: 'KoalaSync | Watch Party für Netflix, YouTube & jedes Video'
};
document.title = titles[activeLang] || titles.en;
} else if (isJoin) {
+117
View File
@@ -0,0 +1,117 @@
# KoalaSync
> KoalaSync is a free, open-source browser extension that keeps video playback synchronized between friends. It works with Netflix, YouTube, Twitch, Emby, Jellyfin and most websites that expose an HTML5 video player. No account is required.
KoalaSync synchronizes playback controls; it does not stream, proxy, host, download or unlock video. Every participant watches the content locally in their own browser and must have legitimate access to the selected website or streaming service.
## Quick fit assessment
KoalaSync is a good fit when users:
- want synchronized play, pause and seeking while watching remotely
- already use a separate voice or video chat application
- want to keep the streaming site's native video and audio quality
- need support beyond a single streaming platform
- prefer a free, ad-free and open-source tool without user accounts
- want the option to self-host the synchronization relay
KoalaSync is not a fit when users need:
- video or screen sharing to people who do not have access to the content
- a hosted video library, remote browser or cloud-streaming service
- built-in text, voice or webcam chat
- a mobile app or Safari extension
- guaranteed compatibility with a player that does not expose an accessible HTML5 video element
## How it works
1. Each participant installs KoalaSync for Chrome, Firefox or a compatible desktop browser.
2. One participant creates a room and shares the generated invitation link.
3. Each participant opens the video locally and selects its browser tab in KoalaSync.
4. The extensions exchange room and playback events through a lightweight WebSocket relay.
5. Each extension applies play, pause and seek actions to the selected local video element.
The relay forwards synchronization messages between room participants. It never receives or forwards the video or audio stream itself. The official public relay is reached through `wss://syncserver.koalastuff.net`; self-hosted deployments commonly run the Node.js service internally on port 3000 behind a TLS reverse proxy.
## Main features
- Synchronized play, pause and seeking
- Host-only control mode and assignable co-host roles
- Episode auto-sync with a lobby that waits until participants are ready
- Video-title matching to help users select corresponding tabs
- Optional manual force-sync controls
- Local audio compressor for balancing quiet dialogue and loud scenes
- Invitation links that can configure official or custom relay servers
- Interface translations in 15 languages
- Self-hostable Node.js WebSocket relay
## Privacy and security
- No KoalaSync account or registration
- No advertising, analytics, tracking pixels or third-party telemetry
- No persistent room database; active room and peer state exists in relay memory only
- Room state is removed when participants leave and inactive rooms expire
- The official relay processes synchronization state, peer identifiers, usernames and optional media metadata while a room is active
- IP addresses are processed temporarily for connection limits and abuse protection
- Official relay console events are ephemeral and are not archived as persistent user logs
- Invitation credentials are placed in the URL fragment, which is not sent to the website server
- The extension activates its video-control logic only in the tab selected by the user
- Source code for the extension, relay and website is publicly auditable under the MIT License
For exact retention periods, metadata controls and permission details, read the [privacy policy](https://sync.koalastuff.net/privacy) and [technical privacy documentation](https://github.com/Shik3i/KoalaSync/blob/main/docs/PRIVACY.md).
## Supported environments
- Google Chrome
- Mozilla Firefox
- Microsoft Edge and other Chromium-based desktop browsers
- Windows, macOS, Linux and ChromeOS
- Websites with an accessible HTML5 `<video>` element
Compatibility depends on each website's player implementation and can change when a streaming provider updates its site. See the [tested-services matrix](https://github.com/Shik3i/KoalaSync/blob/main/docs/TESTED_SERVICES.md) for current details and limitations.
## Install KoalaSync
- [Chrome Web Store](https://chromewebstore.google.com/detail/koalasync/obbnmkmlaaddodakcbdljknjpagklifc): Chrome, Edge and compatible Chromium browsers
- [Firefox Add-ons](https://addons.mozilla.org/firefox/addon/koalasync/): Firefox
- [GitHub Releases](https://github.com/Shik3i/KoalaSync/releases): Release notes and manual packages
## Technical information
- Current website release: 2.5.4
- License: MIT
- Extension runtime: dependency-free browser extension code
- Relay: Node.js with Socket.IO-compatible WebSocket messaging
- Persistence: RAM-only room state; no room database
- Official relay: `wss://syncserver.koalastuff.net`
- Self-hosting: Docker image `ghcr.io/shik3i/koalasync:latest`
- Source repository: [github.com/Shik3i/KoalaSync](https://github.com/Shik3i/KoalaSync)
## Documentation
- [How KoalaSync works](https://github.com/Shik3i/KoalaSync/blob/main/docs/HOW_IT_WORKS.md)
- [Architecture](https://github.com/Shik3i/KoalaSync/blob/main/docs/ARCHITECTURE.md)
- [WebSocket protocol](https://github.com/Shik3i/KoalaSync/blob/main/docs/PROTOCOL.md)
- [Privacy](https://github.com/Shik3i/KoalaSync/blob/main/docs/PRIVACY.md)
- [Security policy](https://github.com/Shik3i/KoalaSync/blob/main/SECURITY.md)
- [Self-hosting guide](https://sync.koalastuff.net/#self-hosting)
- [Changelog](https://github.com/Shik3i/KoalaSync/blob/main/docs/CHANGELOG.md)
## Comparisons and alternatives
- [Watch-party comparison overview](https://sync.koalastuff.net/alternatives/)
- [KoalaSync vs Teleparty](https://sync.koalastuff.net/alternatives/teleparty)
- [KoalaSync vs Watch2Gether](https://sync.koalastuff.net/alternatives/watch2gether)
- [KoalaSync vs Scener](https://sync.koalastuff.net/alternatives/scener)
- [KoalaSync vs Kosmi](https://sync.koalastuff.net/alternatives/kosmi)
- [KoalaSync vs TwoSeven](https://sync.koalastuff.net/alternatives/twoseven)
- [KoalaSync vs screen sharing](https://sync.koalastuff.net/alternatives/screen-sharing)
## Contact and project status
- [Main website](https://sync.koalastuff.net/)
- [GitHub issues](https://github.com/Shik3i/KoalaSync/issues): Bugs, compatibility reports and feature requests
- [Mastodon](https://mastodon.social/@koalastuff): Private contact and project updates
- [Legal notice](https://sync.koalastuff.net/imprint)
KoalaSync is an independent project and is not affiliated with, endorsed by or associated with Netflix, Disney+, Amazon, YouTube, Twitch or any other streaming platform. All trademarks belong to their respective owners.
+114 -34
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "de_DE",
"META_TITLE": "KoalaSync | Netflix, YouTube & jedes Video mit Freunden synchronisieren",
"META_DESCRIPTION": "Schaue Netflix, YouTube, Twitch und jedes HTML5-Video synchron mit Freunden. Kostenlose, quelloffene Browser-Erweiterung. Keine Anmeldung erforderlich.",
"SCHEMA_APP_DESC": "Schaue Netflix, YouTube, Twitch und jedes HTML5-Video synchron mit Freunden. Kostenlose, quelloffene Browser-Erweiterung. Keine Anmeldung erforderlich.",
"OG_TITLE": "KoalaSync | Netflix, Emby, Jellyfin & fast jedes Video mit Freunden synchronisieren",
"OG_DESCRIPTION": "Schaue Netflix, Emby, Jellyfin, YouTube, Twitch und fast jedes HTML5-Video perfekt synchronisiert. Quelloffene, datenschutzfreundliche Browser-Erweiterung für Chrome und Firefox.",
"TWITTER_TITLE": "KoalaSync | Netflix, Emby, Jellyfin & fast jedes Video mit Freunden synchronisieren Browser-Erweiterung",
"TWITTER_DESCRIPTION": "Schaue Netflix, Emby, Jellyfin, YouTube, Twitch und fast jedes HTML5-Video perfekt synchronisiert mit Freunden. Datenschutzfreundliche Browser-Erweiterung für Chrome und Firefox.",
"META_TITLE": "KoalaSync | Watch Party für Netflix, YouTube & jedes Video",
"META_DESCRIPTION": "Watch Party auf Netflix, YouTube, Twitch & HTML5-Videos. Open-Source-Erweiterung für Chrome & Firefox. Kein Konto, kein Tracking, keine Werbung.",
"SCHEMA_APP_DESC": "Watch Party auf Netflix, YouTube, Twitch & HTML5-Videos. Open-Source-Erweiterung für Chrome & Firefox. Kein Konto, kein Tracking, keine Werbung.",
"OG_TITLE": "KoalaSync | Watch Party für Netflix, Emby, Jellyfin & fast jedes Video",
"OG_DESCRIPTION": "Starte eine Watch Party auf Netflix, Emby, Jellyfin, YouTube, Twitch und fast jedem HTML5-Video. Open Source, datenschutzfreundlich und ohne Konto.",
"TWITTER_TITLE": "KoalaSync | Watch Party für Netflix, Emby, Jellyfin & fast jedes Video Browser-Erweiterung",
"TWITTER_DESCRIPTION": "Starte eine Watch Party auf Netflix, Emby, Jellyfin, YouTube, Twitch und fast jedem HTML5-Video. Open Source, datenschutzfreundlich und ohne Konto.",
"NAV_FEATURES": "Funktionen",
"NAV_HOW_IT_WORKS": "So funktioniert's",
"HERO_TITLE": "Gemeinsam schauen.<span class='hero-line2'>Perfekt synchron.</span>",
"HERO_SUBTITLE": "Dein Kino-Abend auf Distanz. Keine Lags, keine Anmeldung. Einfach Link teilen und zusammen schauen.",
"HERO_TITLE": "Mach jedes Video zur <span class='hero-highlight'>Watch Party</span>.",
"HERO_SUBTITLE": "Dein Kino-Abend auf Distanz, ohne Lags. Kein Account, kein Tracking, keine Werbung. Einfach Link teilen und gemeinsam Play drücken.",
"HERO_MASCOT_ALT": "Ein niedlicher Koala steht da und schaut nach unten auf die Download-Buttons",
"DEMO_SYNC": "Synchron",
"DEMO_HINT": "Live-Demo: Drück Play in einem der Tabs, KoalaSync hält beide synchron.",
"DEMO_NO_ROOM": "Noch nicht verbunden",
"DEMO_CREATE_ROOM": "Raum erstellen",
"DEMO_JOINED": "Raum beigetreten",
"DEMO_TAB_SELECTED": "Tab ausgewählt",
"DEMO_SELECT_PLACEHOLDER": "Video-Tab wählen…",
"MOBILE_DEMO_CTA": "Live-Demo ansehen",
"MOBILE_DEMO_TITLE": "KoalaSync Live-Demo",
"MOBILE_DEMO_CLOSE": "Demo schließen",
"ADD_TO_CHROME": "Zu Chrome hinzufügen",
"ADD_TO_FIREFOX": "Zu Firefox hinzufügen",
"COMPAT_HEADING": "Funktioniert auf deinen Lieblingsplattformen",
@@ -35,22 +45,22 @@
"USE_CASE_3_DESC": "Überbrückt die Distanz und genießt gemeinsame Date-Nächte. Erlebt jeden Plot-Twist, lacht über dieselben Witze und teilt emotionale Momente zur selben Millisekunde.",
"WHY_TITLE": "Warum KoalaSync?",
"WHY_SUBTITLE": "Entwickelt für zuverlässigen Sync, Datenschutz und einfache Einrichtung.",
"FEATURE_1_TITLE": "Volle Kontrolle, in Echtzeit",
"FEATURE_1_DESC": "Einer pausiert, alle pausieren. Einer spult, alle folgen. Unser Zwei-Phasen-Synchronisationsprotokoll koordiniert die Wiedergabe aller Teilnehmer in Echtzeit.",
"FEATURE_1_TITLE": "Raum-Kontrolle & Sync",
"FEATURE_1_DESC": "Du bestimmst, wer die Wiedergabe steuert. Aktiviere die Host-Steuerung, damit nur du pausieren und spulen darfst, oder ernenne Co-Hosts in der Teilnehmerliste.",
"FEATURE_2_TITLE": "Grenzenloses Bingen",
"FEATURE_2_DESC": "Nächste Episode startet für jeden zeitgleich. KoalaSync erkennt den Episodenwechsel und pausiert, bis jeder Teilnehmer das neue Video fertig geladen hat.",
"FEATURE_3_TITLE": "Keine Accounts / Datenschutz",
"FEATURE_3_DESC": "Kein Login. Keine Daten. Einfach Link teilen und schauen. Der Server läuft flüchtig im RAM und löscht deinen Raum komplett nach dem Verlassen.",
"FEATURE_4_TITLE": "Universeller HTML5-Support",
"FEATURE_4_DESC": "Unterstützt YouTube, Twitch, Netflix, Jellyfin, Emby und fast jede beliebige Webseite mit einem HTML5-Video-Tag. Ideal auch für eigene Medienbibliotheken. Es werden keinerlei Videodaten an unsere Server gesendet — nur Synchronisations-Metadaten.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby und fast jede Seite mit HTML5-Video. Nur Sync-Signale verlassen deinen Browser, nie das Video.",
"FEATURE_5_TITLE": "Self-Hostable & Docker-Ready",
"FEATURE_5_DESC": "Unsere Server sind kostenlos und schnell, aber du kannst auch die volle Kontrolle übernehmen, wenn du willst. Starte dein eigenes privates Relay in Sekunden via Docker.",
"FEATURE_6_TITLE": "Direkte Einladungen & 1-Klick Beitritt",
"FEATURE_6_DESC": "Keine lästigen IPs oder Passwörter austauschen. Teile einfach einen Einladungslink mit deinen Freunden, um sie mit einem Klick in den Raum zu holen.",
"FEATURE_7_TITLE": "Lautstärke Angleichen / Audio Compressor",
"FEATURE_7_DESC": "Nie wieder am Lautstärkeregler spielen. Der eingebaute Audio Compressor verstärkt leise Dialoge und zähmt laute Explosionen. Funktioniert auf Netflix, Prime Video, Disney+, YouTube und jedem HTML5-Video. Komplett lokal — keine Audiodaten verlassen deinen Computer.",
"FEATURE_7_DESC": "Nie wieder am Lautstärkeregler spielen. Ein eingebauter Kompressor hebt leise Dialoge an und dämpft laute Explosionen, alles lokal im Browser verarbeitet.",
"FEATURE_8_TITLE": "Open Source (MIT-Lizenz)",
"FEATURE_8_DESC": "Der gesamte Quellcode ist auf GitHub öffentlich einsehbar. Keine Black Boxes, keine proprietären Teile 100 % Transparenz vom Relay-Server bis zur Browser-Erweiterung.",
"FEATURE_8_DESC": "Der gesamte Quellcode ist auf GitHub öffentlich einsehbar. Keine Black Boxes, keine proprietären Teile. 100 % Transparenz vom Relay-Server bis zur Browser-Erweiterung.",
"COMP_TITLE": "KoalaSync vs. Teleparty",
"COMP_SUBTITLE": "Erfahre, warum Open Source, Werbefreiheit und echter Datenschutz die bessere Wahl für gemeinsames Schauen sind.",
"COMP_COL_FEATURE": "Funktion",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Datenschutzerklärung und Tracker-Erfassung von Teleparty:",
"COMP_FOOTNOTE_4": "Funktioniert auf allen Seiten, die Skript-Injektionen in Standard-HTML5-Videoplayer erlauben. Seiten mit extrem strengen Content Security Policies (CSP), DRM-Kopierschutz oder stark verschachtelten Player-Wrappern (z. B. komplexe Shadow-DOMs) können die automatische Steuerung blockieren.",
"STEPS_TITLE": "Erste Schritte",
"STEP_1_TITLE": "Erweiterung installieren",
"STEP_1_DESC": "Füge KoalaSync aus dem Chrome Web Store, den Firefox Add-ons oder über die Entwickler-ZIP von GitHub zu deinem Browser hinzu.",
"STEP_1_ILLUS_DESC": "Privatsphäre-fokussierte Video-Synchronisation",
"STEP_1_ILLUS_DL_CHROME": "Download für Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Download für Firefox",
"STEP_1_ILLUS_ACTIVE": "Erweiterung aktiv",
"STEP_1_ILLUS_READY": "Bereit zum Mitschauen!",
"STEP_2_TITLE": "Raum erstellen",
"STEP_2_DESC": "Öffne die Erweiterung und klicke auf „+ Neuer Raum“. KoalaSync generiert automatisch eine sichere Raum-ID samt Passwort, tritt dem Raum bei und kopiert den Einladungslink in deine Zwischenablage.",
"STEP_1_TITLE": "Raum erstellen & teilen",
"STEP_1_DESC": "Öffne das Popup der Erweiterung, erstelle einen Raum mit einem Klick und teile den generierten Link mit deinen Freunden. Sie treten über die Einladungsbrücke sofort bei.",
"STEP_1_ILLUS_DESC": "Wähle einen Video-Tab",
"STEP_1_ILLUS_DL_CHROME": "YouTube-Tab verbinden",
"STEP_1_ILLUS_DL_FIREFOX": "Netflix-Tab verbinden",
"STEP_1_ILLUS_ACTIVE": "Tab verbunden",
"STEP_1_ILLUS_READY": "Bereit für synchrones Schauen!",
"STEP_2_TITLE": "Video-Tab auswählen",
"STEP_2_DESC": "Klicke auf den Tab deines Videos und wähle im Popup den Tab aus, den du synchronisieren möchtest. KoalaSync übernimmt ab jetzt die automatische Verbindung.",
"STEP_2_ILLUS_ROOM": "Raum",
"STEP_2_ILLUS_SYNC": "Sync",
"STEP_2_ILLUS_SETTINGS": "Optionen",
"STEP_2_ILLUS_CREATE": "+ Neuer Raum",
"STEP_2_ILLUS_MANUAL": "Manuell verbinden / Erweitert",
"STEP_2_ILLUS_COPIED": "Einladungslink kopiert!",
"STEP_3_TITLE": "Teilen & Synchronisieren",
"STEP_3_DESC": "Sende den Einladungslink an deine Freunde. Sobald sie beitreten, wähle deinen Video-Tab aus und genieße die synchronisierte Wiedergabe.",
"STEP_3_TITLE": "Synchron genießen",
"STEP_3_DESC": "Drücke auf Wiedergabe. Egal wer pausiert, spult oder startet: Alles läuft bei allen Beteiligten absolut zeitgleich und verzögerungsfrei ab.",
"STEP_3_ILLUS_IN_SYNC": "SYNCHRON",
"SELF_TITLE": "Für Self-Hoster",
"SELF_SUBTITLE": "Du traust dem Server nicht? Behalte die volle Datenhoheit. Richte deinen eigenen privaten Relay-Server in wenigen Minuten ein.",
@@ -116,21 +126,21 @@
"FAQ_TITLE": "Häufig gestellte Fragen",
"FAQ_SUBTITLE": "Alles, was du über synchrones Videoschauen mit Freunden wissen musst.",
"FAQ_Q1": "Kann ich Netflix, Emby oder Jellyfin synchron mit Freunden schauen?",
"FAQ_A1": "Ja! KoalaSync funktioniert mit Netflix, YouTube, Twitch und jeder Website mit einem HTML5-Videoplayer einschließlich Emby, Jellyfin und eigenen Medienservern. Installiere die Erweiterung, erstelle einen Raum, teile den Einladungslink und alle schauen perfekt synchron.",
"FAQ_A1": "Ja! KoalaSync funktioniert mit Netflix, YouTube, Twitch und jeder Website mit einem HTML5-Videoplayer, einschließlich Emby, Jellyfin und eigenen Medienservern. Installiere die Erweiterung, erstelle einen Raum, teile den Einladungslink und alle schauen perfekt synchron.",
"FAQ_Q_VIDEO_ACCESS": "Streamt KoalaSync das Video an meine Freunde?",
"FAQ_A_VIDEO_ACCESS": "Nein. KoalaSync streamt, hostet oder teilt keine Videoinhalte und umgeht keinen Zugang. Jede Person schaut das Video lokal im eigenen Browser und braucht selbst Zugriff auf die jeweilige Website oder den Streamingdienst, zum Beispiel ein eigenes Netflix-Konto. KoalaSync synchronisiert nur Aktionen wie Play, Pause und Spulen.",
"FAQ_Q2": "Ist KoalaSync eine kostenlose Alternative zu Teleparty?",
"FAQ_A2": "100 % kostenlos und Open Source unter der MIT-Lizenz. Keine Premium-Stufen, keine gesperrten Funktionen, keine Werbung. Anders als Teleparty läuft KoalaSyncs Relay-Server ausschließlich im RAM ohne Datensammlung und ohne Benutzerkonten.",
"FAQ_A2": "100 % kostenlos und Open Source unter der MIT-Lizenz. Keine Premium-Stufen, keine gesperrten Funktionen, keine Werbung. Anders als Teleparty läuft KoalaSyncs Relay-Server ausschließlich im RAM, ohne Datensammlung und ohne Benutzerkonten.",
"FAQ_Q3": "Funktioniert KoalaSync mit Emby, Jellyfin und eigenen Medienservern?",
"FAQ_A3": "Ja. KoalaSync erkennt jedes HTML5-Videoelement und funktioniert perfekt mit Emby, Jellyfin, Plex und beliebigen eigenen Streaming-Setups. Du kannst den KoalaSync Relay-Server auch via Docker selbst hosten.",
"FAQ_Q4": "Welche Browser und Plattformen unterstützen KoalaSync?",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave und alle Chromium-basierten Browser. Direkt aus dem Chrome Web Store oder den Firefox Add-ons installieren keine manuelle Konfiguration nötig.",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave und alle Chromium-basierten Browser. Direkt aus dem Chrome Web Store oder den Firefox Add-ons installieren, keine manuelle Konfiguration nötig.",
"FAQ_Q5": "Müssen alle meine Freunde die Erweiterung installieren?",
"FAQ_A5": "Ja, jeder Teilnehmer braucht KoalaSync aber ohne Anmeldung oder Kontoerstellung. Einfach auf den Einladungslink klicken, die Erweiterung installieren (falls nicht vorhanden) und du bist automatisch im Raum.",
"FAQ_A5": "Ja, jeder Teilnehmer braucht KoalaSync, aber ohne Anmeldung oder Kontoerstellung. Einfach auf den Einladungslink klicken, die Erweiterung installieren (falls nicht vorhanden) und du bist automatisch im Raum.",
"FAQ_Q6": "Sind meine Daten sicher? Was, wenn ich dem offiziellen Server nicht traue?",
"FAQ_A6": "Absolut sicher. Der KoalaSync Relay-Server läuft ausschließlich im RAM alle Sitzungsdaten werden sofort gelöscht, sobald du den Raum verlässt. Keine Datenbank, keine Protokolle, keine Analysen, keine Benutzerkonten. Wenn du volle Kontrolle möchtest: hoste deinen eigenen privaten Relay-Server via Docker in wenigen Minuten. Der gesamte Quellcode ist Open Source und auf GitHub einsehbar.",
"FAQ_A6": "Absolut sicher. Der KoalaSync Relay-Server läuft ausschließlich im RAM, alle Sitzungsdaten werden sofort gelöscht, sobald du den Raum verlässt. Keine Datenbank, keine Protokolle, keine Analysen, keine Benutzerkonten. Wenn du volle Kontrolle möchtest: hoste deinen eigenen privaten Relay-Server via Docker in wenigen Minuten. Der gesamte Quellcode ist Open Source und auf GitHub einsehbar.",
"FAQ_Q7": "Kann ich leise Dialoge und laute Explosionen beim Videoschauen im Browser ausgleichen?",
"FAQ_A7": "Ja. KoalaSync 2.2.0 enthält einen eingebauten Audio Compressor, der den Unterschied zwischen lauten und leisen Passagen reduziert. Er läuft lokal über die Web Audio API keine Audiodaten verlassen deinen Computer. Öffne das Popup, erstelle einen Raum, gehe zu Einstellungen → Audio Processing, schalte den Compressor ein und wähle ein Preset. Funktioniert auf Netflix, Prime Video, Disney+, YouTube und allen HTML5-Video-Seiten.",
"FAQ_A7": "Ja. KoalaSync 2.2.0 enthält einen eingebauten Audio Compressor, der den Unterschied zwischen lauten und leisen Passagen reduziert. Er läuft lokal über die Web Audio API, keine Audiodaten verlassen deinen Computer. Öffne das Popup, erstelle einen Raum, gehe zu Einstellungen → Audio Processing, schalte den Compressor ein und wähle ein Preset. Funktioniert auf Netflix, Prime Video, Disney+, YouTube und allen HTML5-Video-Seiten.",
"HOWTO_TITLE": "So synchronisierst du Videos mit Freunden mit KoalaSync",
"HOWTO_DESC": "Schaue Videos perfekt synchron mit Freunden auf YouTube, Netflix, Twitch und mehr. Keine Anmeldung, kein Tracking.",
"HOWTO_STEP_1_NAME": "Browser-Erweiterung installieren",
@@ -140,7 +150,7 @@
"HOWTO_STEP_3_NAME": "Teilen und synchronisieren",
"HOWTO_STEP_3_TEXT": "Sende den Einladungslink an deine Freunde. Wähle einen Video-Tab aus und genieße synchronisierte Wiedergabe in Echtzeit.",
"FOOTER_MIT": "Open Source unter der MIT-Lizenz.",
"FOOTER_RAM": "Keine Daten werden auf unseren Servern gespeichert. Reines RAM-basiertes Relay.",
"FOOTER_RAM": "Keine Relay-Logs. Kein Tracking. Website-Access-Logs werden nach 7 Tagen gelöscht.",
"FOOTER_LEGAL": "Impressum",
"FOOTER_PRIVACY": "Datenschutz",
"MOCK_01": "Aktiver Raum",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SYNC",
"MOCK_14": "Zu anderen springen",
"MOCK_15": "Letzte Aktivität",
"MOCK_16": "Warten auf 1 Partner (KoalaPC)...",
"MOCK_16": "Warten auf 1 Partner (🐶 HappyDog)...",
"MOCK_17": "Überspringen & abspielen",
"MOCK_18": "Dein Benutzername",
"MOCK_19": "Noise-Filterung",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "de/datenschutz",
"FOOTER_DISCLAIMER": "KoalaSync ist nicht mit Netflix, Disney+, Amazon, YouTube, Twitch oder anderen Streaming-Plattformen verbunden, wird von diesen nicht unterstützt oder steht in keiner Beziehung zu diesen. Alle Markenrechte liegen bei ihren jeweiligen Inhabern.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync - Vergleiche & Anleitungen",
"ALT_INDEX_META_DESC": "Entdecke ehrliche Vergleiche und detaillierte Leitfäden zwischen KoalaSync und anderen Watch-Party-Erweiterungen.",
"ALT_INDEX_HEADING": "Vergleiche & Anleitungen",
"ALT_INDEX_INTRO": "Wie schlägt sich KoalaSync im Vergleich zu anderen Watch-Party-Tools und Streaming-Lösungen? Lies unsere ehrlichen, technischen Vergleiche, um die passende Lösung für deine Filmabende zu finden.",
"ALT_INDEX_READ_COMPARISON": "Vergleich lesen →",
"ALT_INDEX_READ_GUIDE": "Anleitung lesen →",
"ALT_INDEX_FOOTER_LINK": "Vergleiche & Anleitungen",
"ALT_TELEPARTY_TITLE": "KoalaSync vs Teleparty: Welche Watch-Party-Lösung passt besser?",
"ALT_TELEPARTY_META_DESC": "Ein ehrlicher Vergleich von KoalaSync und Teleparty für Watch-Partys, eingebauten Chat, Mobile-Support, Browser-Video-Sync, selbst gehostete Medienserver und Open Source.",
"ALT_TELEPARTY_INTRO": "KoalaSync und Teleparty lösen beide dasselbe nervige Problem: Du willst mit anderen Leuten online etwas schauen, ohne ständig „3, 2, 1, Play“ sagen zu müssen. Beide synchronisieren Videowiedergabe, aber sie gehen ziemlich unterschiedlich an die Sache ran.<br><br>Teleparty ist sinnvoll, wenn du einen eingebauten Chat möchtest oder am Handy schauen willst. KoalaSync ist eher für Desktop-Browser-Watch-Partys gedacht, bei denen du sowieso schon mit Freunden in Discord, Teamspeak oder einem anderen Voice-Call bist und einfach nur die Wiedergabe synchron halten möchtest.<br><br>Der Hauptgrund, warum ich KoalaSync gebaut habe, war Flexibilität. Es soll mit fast jeder Website funktionieren, die einen normalen Browser-Videoplayer nutzt, nicht nur mit einer festen Liste an Plattformen. Dazu gehören auch selbst gehostete Setups wie Emby, Jellyfin und Plex, lokale oder private Domains und viele normale Videoseiten im Browser.",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSync ersetzt keinen Voice-Call. Wenn ihr beim Schauen reden wollt, nutzt ihr weiterhin Discord, Teamspeak, Signal, WhatsApp oder was auch immer ihr normalerweise verwendet.<br><br>Außerdem braucht jede Person selbst Zugriff auf das Video oder die jeweilige Seite. KoalaSync umgeht keine Abos, Logins, DRM, regionale Einschränkungen oder Plattformregeln.<br><br>KoalaSync ist aktuell Desktop-Browser-only, hat keinen eingebauten Chat oder Voice-Chat und die Funktion hängt immer vom jeweiligen Browser und Videoplayer ab.",
"ALT_SCREEN_SUMMARY_TITLE": "Kurz gesagt",
"ALT_SCREEN_SUMMARY_BODY": "Bildschirmübertragung ist die einfachste Lösung, wenn es schnell gehen soll und Qualität, Privatsphäre oder individuelle Kontrolle nicht so wichtig sind. KoalaSync passt besser, wenn jeder lokal im eigenen Browser schauen soll und sich der Filmabend mehr wie wirklich gemeinsames Schauen anfühlen soll.",
"ALT_TRY_KOALASYNC": "KoalaSync ausprobieren"
"ALT_W2G_TITLE": "KoalaSync vs Watch2Gether: Welche Watch-Party-Lösung passt besser?",
"ALT_W2G_META_DESC": "Ein ehrlicher Vergleich von KoalaSync und Watch2Gether für Watch-Partys. Erfahre, wann KoalaSyncs Flexibilität unschlagbar ist und warum Watch2Gether für YouTube die Nase vorn hat.",
"ALT_W2G_INTRO": "KoalaSync und Watch2Gether lösen beide dasselbe Problem: Du willst mit Freunden online Videos schauen, ohne ständig manuell abgleichen zu müssen. Während Watch2Gether einer der ältesten und bekanntesten Dienste für gemeinsame Videoabende ist, geht KoalaSync einen ganz anderen, minimalistischen Weg. Welches Tool das richtige für dich ist, hängt stark davon ab, was und wo du schauen möchtest.",
"ALT_W2G_WHEN_W2G_TITLE": "Wann Watch2Gether die bessere Wahl ist",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether ist unschlagbar für <strong>YouTube-Watch-Partys</strong>. Dank integrierter Playlist und Suche kann jeder in der Lobby sofort neue Videos suchen, hinzufügen und abspielen. Alle schauen nahtlos das nächste Video zusammen.<br><br>Bei KoalaSync greift auf YouTube die Autoplay-Logik der Website: Nach Videoende wird jeder auf ein anderes Empfehlungsvideo geleitet. Unsere automatische Folgen-Fortsetzung („Episode Lobby“), die auf Netflix oder Disney+ super funktioniert, klappt auf YouTube wegen dieser dynamischen Vorschläge leider nicht. Für reine YouTube-Abende ist Watch2Gether daher die bessere Wahl.",
"ALT_W2G_WHEN_KOALA_TITLE": "Wann KoalaSync besser passt",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync glänzt bei <strong>echten Streaming-Diensten</strong> (Netflix, Prime Video, Disney+) und selbstgehosteten Medienservern (Jellyfin, Plex, Emby). Im Gegensatz zu Watch2Gether, das oft keine Premium-Inhalte abspielen kann, synchronisiert KoalaSync den echten Original-Player direkt auf der jeweiligen Website.<br><br>Es funktioniert auf fast jeder Seite mit einem normalen HTML5-Videoplayer. Du musst keinen virtuellen Raum auf einer Drittseite erstellen: Einfach die Extension aktivieren, mit Freunden verbinden und losschauen.",
"ALT_W2G_MAIN_DIFF_TITLE": "Der wichtigste Unterschied",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether ist eine <strong>eigenständige Website</strong> mit integriertem Chat, Playlist und Webcam-Support. KoalaSync ist eine <strong>minimalistische Erweiterung</strong>, die sich direkt in deine normalen Browser-Tabs einklinkt.<br><br>Suchst du ein All-in-One-Paket für YouTube mit Chat? Nimm Watch2Gether. Willst du Filme auf Netflix oder deinem eigenen Server ohne Ablenkung, ohne Umwege und in voller nativer Bildqualität (ohne Server-Komprimierung) genießen? Dann ist KoalaSync die sauberere Lösung.",
"ALT_W2G_LIMITS_TITLE": "Ehrliche Grenzen",
"ALT_W2G_LIMITS_BODY": "KoalaSync hat <strong>keine eigene Playlist oder Suche</strong> wie Watch2Gether. Auf YouTube führt das dazu, dass das automatische Abspielen der nächsten Videos nicht synchron läuft.<br><br>Zudem gibt es <strong>keinen integrierten Chat</strong> und KoalaSync läuft aktuell nur auf Desktop-Browsern. Es ist so gedacht, dass ihr ohnehin über Discord, Teamspeak oder andere Voice-Tools miteinander sprecht.",
"ALT_W2G_SUMMARY_TITLE": "Kurz gesagt",
"ALT_W2G_SUMMARY_BODY": "Für spontane YouTube-Sessions mit Playlists und integriertem Chat ist Watch2Gether die beste Wahl. Für echte Premium-Streaming-Plattformen (wie Netflix, Prime Video, Disney+), selbstgehostete Server (Jellyfin, Plex, Emby) und maximale Flexibilität im Browser ist KoalaSync das passendere und schlankere Tool.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener: Welche Watch-Party-Lösung passt besser?",
"ALT_SCENER_META_DESC": "Ein ehrlicher Vergleich von KoalaSync und Scener. Erfahre, wann Scener mit Webcam-Chat punktet und warum KoalaSync für werbefreie Filmabende die Nase vorn hat.",
"ALT_SCENER_INTRO": "KoalaSync und Scener gehen das Thema Watch-Partys aus zwei völlig verschiedenen Richtungen an. Scener versteht sich als virtuelles Kino mit integriertem Video-Chat und interaktiven Räumen. KoalaSync ist dagegen eine minimalistische, datenschutzfreundliche Browser-Erweiterung, die einfach nur deine Videowiedergabe synchronisiert. Welches Tool besser zu dir passt, hängt vor allem davon ab, wie wichtig dir Webcams und integrierter Chat beim Streamen sind.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Wann Scener die bessere Wahl ist",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener ist eine solide Wahl, wenn du eine <strong>All-in-One-Social-Plattform</strong> mit integriertem Video- und Audio-Chat direkt im Browserfenster suchst. Scener erstellt einen virtuellen Raum, in dem der Player und die Webcams deiner Freunde nebeneinander angezeigt werden. Dies ist ideal für große, öffentliche Watch-Partys oder virtuelle Streaming-Events, bei denen der soziale Aspekt im Vordergrund steht. Beachte jedoch, dass die kostenlose Basisversion durch Werbung finanziert wird und Scener viele Funktionen (wie werbefreies Schauen und unbegrenzten Video-Chat) hinter einem kostenpflichtigen Premium-Abo ($5.79/Monat oder $39.99/Jahr) versteckt.",
"ALT_SCENER_WHEN_KOALA_TITLE": "Wann KoalaSync besser passt",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync punktet bei <strong>Bildqualität, Datenschutz und Einfachheit</strong>:<br><br>• <strong>Keine Accounts</strong>: Du musst dich nicht registrieren, einloggen oder Profile verwalten. Einfach Extension aktivieren, Raumcode teilen und losschauen.<br>• <strong>Echte native Qualität (4K/HDR)</strong>: Scener streamt ein komprimiertes Bild von einem virtuellen Cloud-Server, was zu Qualitätsverlusten und Rucklern führen kann. KoalaSync synchronisiert den echten Original-Player direkt auf deinem Computer. Du schaust Filme also in voller nativer Auflösung deines Streaming-Abos.<br>• <strong>Geringer Datenverbrauch</strong>: Da nur Steuerungsdaten (Play, Pause, Zeitstempel) übertragen werden, verbraucht KoalaSync fast keine zusätzliche Bandbreite. Scener streamt das gesamte Video und Kamerabilder über Cloud-Server, was leistungsschwächere Laptops und Internetleitungen stark beanspruchen kann.<br>• <strong>100 % kostenlos & werbefrei</strong>: Keine monatlichen Gebühren, keine Werbung.<br>• <strong>Lokale Videodateien</strong>: Da KoalaSync lokal läuft, kannst du sogar eigene Videodateien (z. B. MP4) synchron mit Freunden schauen. Ziehe die Datei einfach per Drag-and-Drop in ein Browser-Tab Scener kann das bauartbedingt (da Scener in der Cloud läuft) nicht.",
"ALT_SCENER_MAIN_DIFF_TITLE": "Der wichtigste Unterschied",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener ist ein <strong>kommerzielles soziales Netzwerk</strong> für Watch-Partys, das auf virtuellen Cloud-Browsern basiert und mit Werbung sowie monatlichen Abonnements finanziert wird. KoalaSync ist eine <strong>datenschutzfreundliche, kostenlose Synchronisations-Erweiterung</strong>, die sich direkt in deine Browser-Tabs einklinkt. Sie überlässt den Chat Programmen wie Discord oder Teamspeak und konzentriert sich ganz darauf, deine Wiedergabe flüssig, privat und in bester Originalqualität zu synchronisieren.",
"ALT_SCENER_LIMITS_TITLE": "Ehrliche Grenzen",
"ALT_SCENER_LIMITS_BODY": "KoalaSync bietet <strong>keinen eigenen Chat und keine Webcam-Unterstützung</strong>. Es ist ausschließlich als Sync-Tool gedacht und erfordert ein separates Kommunikations-Tool deiner Wahl. Zudem ist KoalaSync derzeit nur für Desktop-Browser verfügbar. Die Kompatibilität lokaler Videodateien hängt außerdem davon ab, ob dein Browser das jeweilige Videoformat und die Audio-Codecs nativ abspielen kann.",
"ALT_SCENER_SUMMARY_TITLE": "Kurz gesagt",
"ALT_SCENER_SUMMARY_BODY": "Für große Watch-Partys mit Webcam-Chat und Social-Features im selben Fenster ist Scener die richtige Wahl, sofern dich Werbung und Premium-Gating nicht stören. Wenn du einfach nur komplett kostenlos, werbefrei und ungestört im echten Player (inklusive Netflix, Prime Video, Disney+ oder sogar lokalen Dateien im Browser) synchron schauen willst und ohnehin in Discord telefonierst, ist KoalaSync die sauberere und performantere Lösung.",
"ALT_KOSMI_TITLE": "KoalaSync vs Kosmi: Welche Netflix-Party-Alternative passt besser?",
"ALT_KOSMI_META_DESC": "Ein ehrlicher Vergleich von KoalaSync und Kosmi. Erfahre, warum Kosmis bequeme No-Extension-Lösung punktet und wann KoalaSyncs native Bildqualität gewinnt.",
"ALT_KOSMI_INTRO": "Sowohl KoalaSync als auch Kosmi bieten hervorragende Möglichkeiten, um Netflix, YouTube und andere Plattformen synchron mit Freunden zu schauen. Doch technisch arbeiten beide Tools grundlegend verschieden. Kosmi setzt auf virtuelle Cloud-Browser, die ohne Erweiterung direkt im Web laufen. KoalaSync ist eine minimalistische Browser-Erweiterung, die deinen lokalen Player synchronisiert. Welcher Ansatz für dich der bessere ist, hängt von deinen Ansprüchen an Bildqualität, Komfort und Datenschutz ab.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Wann Kosmi die bessere Wahl ist",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi ist unschlagbar, wenn du <strong>überhaupt nichts installieren</strong> möchtest oder auf Geräten wie Tablets oder Smartphones mitschauen willst. Da Kosmi über virtuelle Browser in der Cloud läuft, reicht ein einfacher Weblink aus, um beizutreten. Zudem bietet Kosmi eine All-in-One-Plattform: Neben Video-Streaming könnt ihr in den virtuellen Räumen auch Multiplayer-Spiele spielen (z. B. NES/SNES-Klassiker oder Pokertische) und den integrierten Webcam-, Voice- und Text-Chat nutzen. Wenn der Fokus auf einem geselligen Spiele- und Videoabend ohne jegliche Installation liegt, ist Kosmi eine fantastische Lösung.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "Wann KoalaSync besser passt",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync glänzt durch seine <strong>native Wiedergabe, maximale Sicherheit und Performance</strong>:<br><br>• <strong>Keine Sicherheitsrisiken</strong>: Bei Kosmi musst du dich auf einem fremden virtuellen Computer in der Cloud in deinen Netflix- oder Prime-Account einloggen. Bei KoalaSync loggst du dich wie gewohnt auf der echten Streaming-Website in deinem eigenen Browser ein. Deine Passwörter verlassen niemals deinen Computer.<br>• <strong>Volle Bildqualität (4K/HDR)</strong>: Kosmi streamt das Bild des virtuellen Browsers als komprimierten Videofeed an dich. KoalaSync synchronisiert die Player lokal: Du genießt Filme in der vollen, gestochen scharfen Originalqualität deines Abos, ohne Pixelmatsch oder Ruckler.<br>• <strong>Schonend für Internet und Akku</strong>: Da KoalaSync nur Steuerdaten (Play/Pause/Zeitstempel) sendet, verbraucht es fast null Bandbreite. Kosmi streamt permanent ein HD-Video aus der Cloud, was schwache Internetverbindungen überlasten kann.<br>• <strong>Lokale Videodateien</strong>: Wenn du ein eigenes Video synchron schauen willst, ziehst du die MP4-Datei einfach per Drag-and-Drop in ein Browser-Tab. KoalaSync synchronisiert sie sofort. Kosmi kann auf deine lokalen Dateien auf der Festplatte nicht zugreifen.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "Der wichtigste Unterschied",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi ist ein <strong>virtueller Treffpunkt</strong> in der Cloud, der einen Remote-Browser per Video-Feed streamt, damit niemand eine Erweiterung installieren muss. KoalaSync ist eine <strong>Schnittstelle für den eigenen Browser</strong>, die sich direkt in den nativen Player auf der echten Website einklinkt. Während Kosmi vielseitiger für Minispiele und Geräte-Kompatibilität ist, bietet KoalaSync das sicherere, flüssigere und schärfere Streaming-Erlebnis im Original-Player.",
"ALT_KOSMI_LIMITS_TITLE": "Ehrliche Grenzen",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync erfordert die <strong>Installation einer Browser-Erweiterung</strong> und läuft derzeit nur auf Desktop-PCs (Windows, Mac, Linux). Es hat <strong>keine integrierten Chats oder Webcams</strong>, da es so gedacht ist, dass ihr ohnehin über Discord oder andere Voice-Tools miteinander sprecht. Zudem bietet KoalaSync keine integrierten Spiele wie Kosmi.",
"ALT_KOSMI_SUMMARY_TITLE": "Kurz gesagt",
"ALT_KOSMI_SUMMARY_BODY": "Für gemütliche Spieleabende inklusive SNES-Klassikern und einfachem Beitreten ohne jegliche Installation auf Smartphones oder Tablets ist Kosmi ideal. Für private Filmabende auf Netflix, Prime Video, Disney+ oder Plex in bester 4K-Originalqualität, mit maximaler Passwort-Sicherheit und minimaler Internet-Belastung ist KoalaSync die deutlich überlegene Wahl.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven: Welche Watch-Party-Lösung passt besser?",
"ALT_TWOSEVEN_META_DESC": "Ein ehrlicher Vergleich von KoalaSync und TwoSeven. Erfahre, wann TwoSeven mit integrierter Webcam punktet und warum KoalaSync für Disney+ und Netflix die Nase vorn hat.",
"ALT_TWOSEVEN_INTRO": "Sowohl KoalaSync als auch TwoSeven nutzen denselben grundlegenden Ansatz für Watch-Partys: Sie synchronisieren den originalen Videoplayer direkt in deinem Browser, anstatt ein komprimiertes Bild aus der Cloud zu streamen. Dadurch bleibt die Bildqualität bei beiden Tools auf Top-Niveau. Doch während TwoSeven als kommerzielles Portal mit integriertem Webcam-Chat und Abonnement-Optionen aufgebaut ist, bleibt KoalaSync eine minimalistische, komplett kostenfreie und datenschutzfreundliche Erweiterung. Welcher Dienst besser zu dir passt, erfährst du hier.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "Wann TwoSeven die bessere Wahl ist",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven ist die richtige Wahl, wenn du eine <strong>All-in-One-Lösung mit integrierter Webcam und Audio-Chat</strong> direkt im Browser suchst. Wenn du deine Freunde beim Schauen unbedingt sehen möchtest, ohne dafür nebenbei Discord oder Teamspeak laufen zu lassen, bietet TwoSeven diese Integration nativ. Zudem läuft der Dienst für YouTube und einige freie Web-Videoplayer ohne zusätzliche Accounts oder Erweiterungen. Er eignet sich gut für kleine Runden von 2 bis 3 Personen, die sich beim Schauen auch visuell austauschen möchten.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "Wann KoalaSync besser passt",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync glänzt durch seine <strong>vollkommene Gebührenfreiheit, Privatsphäre und Einfachheit</strong>:<br><br>• <strong>Keine Bezahlschranken (Paywalls)</strong>: Um bei TwoSeven Premium-Dienste wie Disney+ oder Hulu synchronisiert zu schauen, muss mindestens ein Teilnehmer im Raum TwoSeven kostenpflichtig auf Patreon unterstützen (ab $3/Monat). KoalaSync synchronisiert Netflix, Prime Video, Disney+ und selbstgehostete Server (Jellyfin, Plex, Emby) zu 100 % kostenlos und ohne Einschränkungen.<br>• <strong>Absoluter Datenschutz (Keine Tracker/Werbung)</strong>: TwoSeven ist werbefinanziert und nutzt zahlreiche Tracker von Google, Facebook und Co. KoalaSync hat keine Werbung, keine Tracker und verbindet sich ausschließlich mit dem RAM-basierten Relay-Server.<br>• <strong>Keine Registrierung erforderlich</strong>: Bei TwoSeven müssen alle Teilnehmer ein Konto erstellen und eingeloggt sein. KoalaSync kommt komplett ohne Accounts aus. Einfach installieren, Raumcode eingeben und loslegen.<br>• <strong>Schlank und ressourcenschonend</strong>: Die integrierten Webcam- und Audio-Feeds von TwoSeven belasten die CPU und Internetleitung stark. Da KoalaSync die Kommunikation externen Tools wie Discord überlässt, läuft es extrem flüssig und schont den Laptop-Akku.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "Der wichtigste Unterschied",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven ist eine <strong>kommerzielle Plattform</strong> mit Kontozwang, Werbung, P2P-Webcam-Chat und Patreon-Paywalls für bestimmte Streaming-Dienste. KoalaSync ist ein <strong>kostenloses Open-Source-Utility</strong>, das sich ohne Registrierung, Tracker oder zusätzliche Kosten einfach in deine Browser-Tabs einklinkt, um das ungestörte Schauen im Original-Player zu ermöglichen.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Ehrliche Grenzen",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync bietet <strong>keinen eigenen Webcam- oder Audio-Chat</strong> und setzt voraus, dass ihr bereits über Discord oder ein ähnliches Tool telefoniert. Zudem hat KoalaSync keine eingebaute Chatbox auf der Webseite und ist derzeit nur für Desktop-Browser verfügbar.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "Kurz gesagt",
"ALT_TWOSEVEN_SUMMARY_BODY": "Für gemütliche Zweier- oder Dreier-Runden, bei denen man sich unbedingt direkt im Browserfenster über Webcams sehen möchte und bereit ist, für Disney+ ein Patreon-Abo abzuschließen, ist TwoSeven eine nette Option. Für werbefreie, komplett kostenlose und private Filmabende in nativer 4K-Qualität (egal ob Netflix, Prime Video, Disney+ oder Jellyfin) ohne Kontozwang ist KoalaSync die sauberere und sicherere Wahl.",
"ALT_TRY_KOALASYNC": "KoalaSync ausprobieren",
"MOCK_HOST_CONTROL_LABEL": "Host-Steuerung",
"MOCK_HOST_CONTROL_TOGGLE": "Nur ich darf die Wiedergabe steuern",
"LABEL_SELECT_VIDEO": "Video auswählen",
"OPTION_SELECT_TAB": "-- Wähle einen Tab --",
"THEME_TOGGLE_LABEL": "Hell-/Dunkelmodus umschalten",
"FAQ_SHOW_ALL": "Alle Fragen anzeigen",
"FAQ_HIDE_ALL": "Fragen ausblenden",
"SELF_SHOW_SETUP": "Setup-Anleitung anzeigen",
"SELF_HIDE_SETUP": "Setup-Anleitung ausblenden",
"HERO_TRUST": "Kostenlos · Open Source · Kein Account nötig",
"COMP_MORE_GUIDES": "Ausführlicher Vergleich und weitere Alternativen"
}
+115 -35
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "de/",
"LANG_TOGGLE_TEXT": "DE",
"OG_LOCALE": "en_US",
"META_TITLE": "KoalaSync | Sync Netflix, YouTube & Any Video with Friends",
"META_DESCRIPTION": "Watch Netflix, YouTube, Twitch & any HTML5 video in perfect sync with friends. Free, open-source browser extension for Chrome and Firefox. No sign-up needed.",
"SCHEMA_APP_DESC": "Watch Netflix, YouTube, Twitch & any HTML5 video in perfect sync with friends. Free, open-source browser extension for Chrome and Firefox. No sign-up needed.",
"OG_TITLE": "KoalaSync | Sync Netflix, Emby, Jellyfin & Almost Any Video with Friends",
"OG_DESCRIPTION": "Watch Netflix, Emby, Jellyfin, YouTube, Twitch and almost any HTML5 video in perfect sync. Privacy-first, open-source browser extension for Chrome & Firefox.",
"TWITTER_TITLE": "KoalaSync | Sync Netflix, Emby, Jellyfin & Almost Any Video with Friends Browser Extension",
"TWITTER_DESCRIPTION": "Watch Netflix, Emby, Jellyfin, YouTube, Twitch and almost any HTML5 video in perfect sync with friends. Privacy-first, open-source browser extension for Chrome and Firefox.",
"META_TITLE": "KoalaSync | Watch Party for Netflix, YouTube & Any Video",
"META_DESCRIPTION": "Host a watch party on Netflix, YouTube, Twitch & HTML5 video. Free open-source extension for Chrome & Firefox. No account, tracking, or ads.",
"SCHEMA_APP_DESC": "Host a watch party on Netflix, YouTube, Twitch & HTML5 video. Free open-source extension for Chrome & Firefox. No account, tracking, or ads.",
"OG_TITLE": "KoalaSync | Watch Party for Netflix, Emby, Jellyfin & Almost Any Video",
"OG_DESCRIPTION": "Host a watch party on Netflix, Emby, Jellyfin, YouTube, Twitch and almost any HTML5 video. Open source, privacy-first, and account-free.",
"TWITTER_TITLE": "KoalaSync | Watch Party for Netflix, Emby, Jellyfin & Almost Any Video Browser Extension",
"TWITTER_DESCRIPTION": "Host a watch party on Netflix, Emby, Jellyfin, YouTube, Twitch and almost any HTML5 video. Open source, privacy-first, and account-free.",
"NAV_FEATURES": "Features",
"NAV_HOW_IT_WORKS": "How it works",
"HERO_TITLE": "Watch Together.<span class='hero-line2'>Sync Perfectly.</span>",
"HERO_SUBTITLE": "Your remote movie night without lags. No registration, no data collection. Just share a link and watch together.",
"HERO_TITLE": "Turn any video into a <span class='hero-highlight'>watch party</span>.",
"HERO_SUBTITLE": "Your remote movie night without lags. No account, no tracking, no ads. Just share a link and press play together.",
"HERO_MASCOT_ALT": "A cute koala standing and looking down at the download buttons",
"DEMO_SYNC": "In sync",
"DEMO_HINT": "Live demo: press play in either tab and KoalaSync keeps both in sync.",
"DEMO_NO_ROOM": "Not connected yet",
"DEMO_CREATE_ROOM": "Create Room",
"DEMO_JOINED": "Room joined",
"DEMO_TAB_SELECTED": "Tab selected",
"DEMO_SELECT_PLACEHOLDER": "Choose a video tab…",
"MOBILE_DEMO_CTA": "Watch how it works",
"MOBILE_DEMO_TITLE": "KoalaSync Live Demo",
"MOBILE_DEMO_CLOSE": "Close demo",
"ADD_TO_CHROME": "Add to Chrome",
"ADD_TO_FIREFOX": "Add to Firefox",
"COMPAT_HEADING": "Works on your favorite platforms",
@@ -35,22 +45,22 @@
"USE_CASE_3_DESC": "Bridge the distance and enjoy date nights. Experience every plot twist, laugh at the same jokes, and share emotional moments at the exact same millisecond.",
"WHY_TITLE": "Why KoalaSync?",
"WHY_SUBTITLE": "Built for reliable sync, privacy-first design, and easy setup.",
"FEATURE_1_TITLE": "Full Control / Instant Sync",
"FEATURE_1_DESC": "One pauses, everyone pauses. One seeks, everyone follows. Our two-phase sync protocol coordinates playback in real time across all participants.",
"FEATURE_1_TITLE": "Host Control & Sync",
"FEATURE_1_DESC": "You decide who controls playback. Turn on Host Control to lock playback actions to yourself, or promote individual peers to co-hosts in the participant list.",
"FEATURE_2_TITLE": "Endless Binge-Watching",
"FEATURE_2_DESC": "Autoplay in sync. KoalaSync automatically detects episode transitions and holds playback until all peers have successfully loaded the next video.",
"FEATURE_3_TITLE": "Zero Accounts / Pure Privacy",
"FEATURE_3_DESC": "No registration, no tracking, no persistency footprints. The server runs entirely in ephemeral RAM and purges your room when you leave.",
"FEATURE_4_TITLE": "Universal HTML5 Support",
"FEATURE_4_DESC": "Works on YouTube, Twitch, Netflix, Jellyfin, Emby, and almost any standard webpage containing a HTML5 video element. Also compatible with custom self-hosted setups. No video data is ever sent to our servers — only synchronization metadata.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby and almost any page with an HTML5 video. Only sync signals leave your browser, never the video.",
"FEATURE_5_TITLE": "Self-Hostable & Docker-Ready",
"FEATURE_5_DESC": "Our official servers are free and fast, but you can take full ownership if you want to. Launch your own private relay server in seconds via Docker.",
"FEATURE_6_TITLE": "Instant Invites / 1-Click Join",
"FEATURE_6_DESC": "No IP addresses or passwords to exchange. Share a generated invite link with your friends to let them join your room automatically with a single click.",
"FEATURE_7_TITLE": "Volume Leveling / Audio Compressor",
"FEATURE_7_DESC": "No more riding the volume knob. Built-in audio compressor boosts quiet dialogue and tames loud explosions. Works on Netflix, Prime Video, Disney+, YouTube, and any HTML5 video. Completely local — no audio data leaves your computer.",
"FEATURE_7_DESC": "No more riding the volume knob. A built-in compressor lifts quiet dialogue and tames loud explosions, all processed locally in your browser.",
"FEATURE_8_TITLE": "Open Source (MIT License)",
"FEATURE_8_DESC": "The entire codebase is publicly auditable on GitHub. No black boxes, no proprietary blobs 100% transparency from the relay server to the browser extension.",
"FEATURE_8_DESC": "The entire codebase is publicly auditable on GitHub. No black boxes, no proprietary blobs. 100% transparency from the relay server to the browser extension.",
"COMP_TITLE": "KoalaSync vs. Teleparty",
"COMP_SUBTITLE": "See why open source, ad-free and privacy-first is the superior way to watch together.",
"COMP_COL_FEATURE": "Feature",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Teleparty privacy policies and tracking data collection:",
"COMP_FOOTNOTE_4": "Works on websites that allow script injections into standard HTML5 video tags. Websites with highly strict Content Security Policies (CSP), DRM copy protection, or heavily obfuscated player wrappers (like complex shadow DOMs) might restrict automated control or injection.",
"STEPS_TITLE": "Getting Started",
"STEP_1_TITLE": "Install Extension",
"STEP_1_DESC": "Add KoalaSync to your browser from the Chrome Web Store, Firefox Add-ons, or download the latest developer ZIP from GitHub.",
"STEP_1_ILLUS_DESC": "Privacy-first video synchronizer",
"STEP_1_ILLUS_DL_CHROME": "Download for Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Download for Firefox",
"STEP_1_ILLUS_ACTIVE": "Extension Active",
"STEP_1_ILLUS_READY": "Ready to watch together!",
"STEP_2_TITLE": "Create a Room",
"STEP_2_DESC": "Open the extension popup and click '+ Create New Room'. KoalaSync automatically generates a secure Room ID and Password, joins it, and copies the invite link to your clipboard.",
"STEP_1_TITLE": "Create & Share Room",
"STEP_1_DESC": "Open the extension popup, create a room with one click, and share the link with your friends. They join instantly via the invitation bridge.",
"STEP_1_ILLUS_DESC": "Select a tab to link",
"STEP_1_ILLUS_DL_CHROME": "Link YouTube Tab",
"STEP_1_ILLUS_DL_FIREFOX": "Link Netflix Tab",
"STEP_1_ILLUS_ACTIVE": "Tab Linked",
"STEP_1_ILLUS_READY": "Ready to sync playback!",
"STEP_2_TITLE": "Select Video Tab",
"STEP_2_DESC": "Go to your video tab and select the tab you want to synchronize in the popup. KoalaSync automatically links your playheads from here.",
"STEP_2_ILLUS_ROOM": "Room",
"STEP_2_ILLUS_SYNC": "Sync",
"STEP_2_ILLUS_SETTINGS": "Settings",
"STEP_2_ILLUS_CREATE": "+ Create New Room",
"STEP_2_ILLUS_MANUAL": "Manual Connect / Advanced",
"STEP_2_ILLUS_COPIED": "Invite link copied!",
"STEP_3_TITLE": "Share & Sync",
"STEP_3_DESC": "Send the invite link to your friends. Once they join, select your video tab and enjoy synchronized playback.",
"STEP_3_TITLE": "Enjoy Perfect Sync",
"STEP_3_DESC": "Press play. Whether someone pauses, seeks, or plays, everyone's playback stays perfectly in sync without any lag.",
"STEP_3_ILLUS_IN_SYNC": "IN SYNC",
"SELF_TITLE": "For Self-Hosters",
"SELF_SUBTITLE": "Don't trust our server? Maintain full data sovereignty. Deploy your own private relay server in minutes.",
@@ -116,21 +126,21 @@
"FAQ_TITLE": "Frequently Asked Questions",
"FAQ_SUBTITLE": "Everything you need to know about watching videos together in perfect sync.",
"FAQ_Q1": "Can I watch Netflix, Emby or Jellyfin together in sync with friends?",
"FAQ_A1": "Yes! KoalaSync works on Netflix, YouTube, Twitch and any website with an HTML5 video player including Emby, Jellyfin and self-hosted media servers. Install the extension, create a room, share the invite link, and everyone watches in perfect sync.",
"FAQ_A1": "Yes! KoalaSync works on Netflix, YouTube, Twitch and any website with an HTML5 video player, including Emby, Jellyfin and self-hosted media servers. Install the extension, create a room, share the invite link, and everyone watches in perfect sync.",
"FAQ_Q_VIDEO_ACCESS": "Does KoalaSync stream the video to my friends?",
"FAQ_A_VIDEO_ACCESS": "No. KoalaSync does not stream, host, share, or bypass access to video content. Everyone watches the video locally in their own browser and needs their own access to the website or streaming service, such as their own Netflix account. KoalaSync only synchronizes playback actions like play, pause, and seeking.",
"FAQ_Q2": "Is KoalaSync a free alternative to Teleparty?",
"FAQ_A2": "100% free and open source under the MIT License. No premium tiers, no locked features, no ads everything is included. Unlike Teleparty, KoalaSync's relay server is RAM-only with zero data collection or user accounts required.",
"FAQ_A2": "100% free and open source under the MIT License. No premium tiers, no locked features, no ads, everything is included. Unlike Teleparty, KoalaSync's relay server is RAM-only with zero data collection or user accounts required.",
"FAQ_Q3": "Does KoalaSync work with Emby, Jellyfin and self-hosted media servers?",
"FAQ_A3": "Yes. KoalaSync detects any standard HTML5 video element, which means it works perfectly with Emby, Jellyfin, Plex, and any custom self-hosted streaming setup. You can also self-host the KoalaSync relay server via Docker for complete data sovereignty.",
"FAQ_Q4": "Which browsers and platforms support KoalaSync?",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave, and all Chromium-based browsers. Install it directly from the Chrome Web Store or Firefox Add-ons no manual configuration needed.",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave, and all Chromium-based browsers. Install it directly from the Chrome Web Store or Firefox Add-ons, no manual configuration needed.",
"FAQ_Q5": "Do all my friends need the extension installed?",
"FAQ_A5": "Yes, each participant needs KoalaSync installed but there's no sign-up or account creation. Simply click the invitation link, install the extension if you haven't already, and you'll join the room automatically in seconds.",
"FAQ_A5": "Yes, each participant needs KoalaSync installed, but there's no sign-up or account creation. Simply click the invitation link, install the extension if you haven't already, and you'll join the room automatically in seconds.",
"FAQ_Q6": "Is my data safe? What if I don't trust the official server?",
"FAQ_A6": "Completely safe. KoalaSync's relay server is RAM-only all session data is permanently deleted the moment you leave the room. No database, no logging, no analytics, no accounts. And if you prefer full control: you can self-host your own private relay server via Docker in minutes. The entire codebase is open source and auditable on GitHub.",
"FAQ_A6": "Completely safe. KoalaSync's relay server is RAM-only, all session data is permanently deleted the moment you leave the room. No database, no logging, no analytics, no accounts. And if you prefer full control: you can self-host your own private relay server via Docker in minutes. The entire codebase is open source and auditable on GitHub.",
"FAQ_Q7": "Can I fix quiet dialogue and loud explosions when watching videos in the browser?",
"FAQ_A7": "Yes. KoalaSync 2.2.0 includes a built-in audio compressor that reduces the gap between quiet and loud parts of your video. It runs locally via the Web Audio API no audio data ever leaves your computer. Open the popup, create a room, go to Settings → Audio Processing, toggle the compressor on, and pick a preset. Works on Netflix, Prime Video, Disney+, YouTube, and any HTML5 video site.",
"FAQ_A7": "Yes. KoalaSync 2.2.0 includes a built-in audio compressor that reduces the gap between quiet and loud parts of your video. It runs locally via the Web Audio API, no audio data ever leaves your computer. Open the popup, create a room, go to Settings → Audio Processing, toggle the compressor on, and pick a preset. Works on Netflix, Prime Video, Disney+, YouTube, and any HTML5 video site.",
"HOWTO_TITLE": "How to synchronize videos with friends using KoalaSync",
"HOWTO_DESC": "Watch any video in perfect sync with friends across YouTube, Netflix, Twitch and more. No sign-up, no tracking.",
"HOWTO_STEP_1_NAME": "Install the browser extension",
@@ -140,7 +150,7 @@
"HOWTO_STEP_3_NAME": "Share and sync",
"HOWTO_STEP_3_TEXT": "Send the invite link to your friends. Pick a video tab and enjoy synchronized playback in real time.",
"FOOTER_MIT": "Open source under the MIT License.",
"FOOTER_RAM": "No data is stored on our servers. Pure RAM-based relay.",
"FOOTER_RAM": "No relay logs. No tracking. Website access logs are deleted after 7 days.",
"FOOTER_LEGAL": "Legal Notice",
"FOOTER_PRIVACY": "Privacy Policy",
"MOCK_01": "Active Room",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SYNC",
"MOCK_14": "Jump to Others",
"MOCK_15": "Last Activity Status",
"MOCK_16": "Waiting for 1 peer (KoalaPC)...",
"MOCK_16": "Waiting for 1 peer (🐶 HappyDog)...",
"MOCK_17": "Skip & Play anyway",
"MOCK_18": "Your Username",
"MOCK_19": "Hide Clutter Tabs",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync is not affiliated with, endorsed by, or associated with Netflix, Disney+, Amazon, YouTube, Twitch, or any other streaming platform. All trademarks are property of their respective owners.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync - Alternatives & Comparisons",
"ALT_INDEX_META_DESC": "Explore honest comparisons and detailed guides comparing KoalaSync with other watch party extensions and streaming solutions.",
"ALT_INDEX_HEADING": "Guides & Comparisons",
"ALT_INDEX_INTRO": "How does KoalaSync stack up against other watch party tools and streaming solutions? Read our honest, technical comparisons to find the best fit for your remote movie nights.",
"ALT_INDEX_READ_COMPARISON": "Read comparison →",
"ALT_INDEX_READ_GUIDE": "Read guide →",
"ALT_INDEX_FOOTER_LINK": "Guides & comparisons",
"ALT_TELEPARTY_TITLE": "KoalaSync vs Teleparty: which watch party tool should you use?",
"ALT_TELEPARTY_META_DESC": "A practical comparison of KoalaSync and Teleparty for watch parties, built-in chat, mobile support, browser video sync, self-hosted media servers and open-source use.",
"ALT_TELEPARTY_INTRO": "KoalaSync and Teleparty both help with the same annoying problem: watching something together without doing the whole \"3, 2, 1, play\" routine. They just take a different approach.<br><br>Teleparty makes the most sense if you want a built-in chat or if you want to watch on mobile. KoalaSync is more for desktop browser watch parties where you are already talking on Discord, Teamspeak or another voice call and just want playback to stay in sync.<br><br>The main reason I built KoalaSync was flexibility. It is meant to work with almost any website that uses a normal browser video player, not just a fixed list of platforms. That includes self-hosted setups like Emby, Jellyfin and Plex, local/private domains, and a lot of normal video pages in the browser.",
@@ -194,7 +211,7 @@
"ALT_TELEPARTY_SUMMARY_BODY": "If you want built-in chat or mobile support, Teleparty may be the better fit. If you want free, open-source desktop browser sync that works with almost any normal video player, including self-hosted media servers like Emby, Jellyfin and Plex, KoalaSync is probably the better match.",
"ALT_SCREEN_TITLE": "KoalaSync vs screen sharing: when is video sync better?",
"ALT_SCREEN_META_DESC": "A practical comparison of KoalaSync and screen sharing for remote movie nights, playback control, video quality, privacy, subtitles and browser-based watching.",
"ALT_SCREEN_INTRO": "Screen sharing works, and sometimes it is honestly enough. One person shares their screen, everyone else watches, and you are done.<br><br>But for longer movie nights or watching episodes together, it can get annoying. The video quality depends on the sharer\u2019s upload, CPU, browser, and whatever compression Discord, Teamspeak, Zoom or another call app applies. Also, only one person really controls the playback.",
"ALT_SCREEN_INTRO": "Screen sharing works, and sometimes it is honestly enough. One person shares their screen, everyone else watches, and you are done.<br><br>But for longer movie nights or watching episodes together, it can get annoying. The video quality depends on the sharers upload, CPU, browser, and whatever compression Discord, Teamspeak, Zoom or another call app applies. Also, only one person really controls the playback.",
"ALT_SCREEN_WHEN_ENOUGH_TITLE": "When screen sharing is enough",
"ALT_SCREEN_WHEN_ENOUGH_BODY": "Screen sharing is fine when you want the fastest possible setup. If only one person has access to the video, or everyone is okay with one person controlling play, pause and seeking, it may be the simplest option.<br><br>It also makes sense when quality is not a big deal, when nobody needs their own subtitles or audio settings, and when the person sharing is comfortable showing that browser window or screen.",
"ALT_SCREEN_WHEN_ANNOYING_TITLE": "Where screen sharing gets annoying",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSync is not a replacement for a voice call. If you want to talk while watching, you still use Discord, Teamspeak, Signal, WhatsApp or whatever you normally use.<br><br>Everyone also needs access to the video or page on their own device. KoalaSync does not bypass subscriptions, logins, DRM, regional restrictions or platform rules.<br><br>It is currently desktop-browser only, has no built-in chat or voice feature, and compatibility always depends on the browser and the video player.",
"ALT_SCREEN_SUMMARY_TITLE": "Summary",
"ALT_SCREEN_SUMMARY_BODY": "Screen sharing is the simplest option when you just want something quick and do not care much about quality, privacy or individual control. KoalaSync is a better fit when everyone should watch locally in their own browser and the session should feel more like actually watching together.",
"ALT_TRY_KOALASYNC": "Try KoalaSync"
"ALT_W2G_TITLE": "KoalaSync vs Watch2Gether: Which watch party solution fits better?",
"ALT_W2G_META_DESC": "An honest comparison between KoalaSync and Watch2Gether. Discover when KoalaSync's flexibility is unbeatable and why Watch2Gether is still the top choice for YouTube.",
"ALT_W2G_INTRO": "KoalaSync and Watch2Gether both solve the same problem: watching videos in sync with friends online without manually coordinating. While Watch2Gether is one of the oldest and most popular hubs for shared movie nights, KoalaSync takes a completely different, lightweight approach. Which tool is right for you depends heavily on what and where you want to watch.",
"ALT_W2G_WHEN_W2G_TITLE": "When Watch2Gether is the better choice",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether is unbeatable for <strong>YouTube watch parties</strong>. With its built-in playlist and search, anyone in the room can easily find, add, and play new videos. Everyone watches the next video together seamlessly.<br><br>With KoalaSync on YouTube, the site's default autoplay takes over, redirecting each user to a different recommended video. Our automatic next-episode feature (\"Episode Lobby\"), which works great on Netflix or Disney+, doesn't work on YouTube due to these dynamic recommendations. For pure YouTube nights, Watch2Gether is the better choice.",
"ALT_W2G_WHEN_KOALA_TITLE": "When KoalaSync fits better",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync shines on <strong>real streaming services</strong> (Netflix, Prime Video, Disney+) and self-hosted media servers (Jellyfin, Plex, Emby). Unlike Watch2Gether, which often cannot play premium content at all, KoalaSync syncs the native player directly on the website.<br><br>It works on almost any site with a standard HTML5 video player. You don't need to set up a virtual room on a third-party site: just activate the extension, join a lobby, and start watching.",
"ALT_W2G_MAIN_DIFF_TITLE": "The main difference",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether is a <strong>standalone website</strong> with built-in chat, playlists, and webcam support. KoalaSync is a <strong>minimalist browser extension</strong> that hooks directly into your normal browser tabs.<br><br>Looking for an all-in-one package for YouTube with built-in chat? Use Watch2Gether. Want to watch movies on Netflix or your own server without distractions, in native quality (no server compression)? KoalaSync is the cleaner solution.",
"ALT_W2G_LIMITS_TITLE": "Honest limitations",
"ALT_W2G_LIMITS_BODY": "KoalaSync <strong>does not have built-in playlists or video search</strong>. On YouTube, this means that autoplaying the next video won't stay in sync.<br><br>Additionally, there is <strong>no built-in chat</strong>, and KoalaSync currently only works on desktop browsers. It is designed under the assumption that you are already talking via Discord, Teamspeak, or other voice tools anyway.",
"ALT_W2G_SUMMARY_TITLE": "In short",
"ALT_W2G_SUMMARY_BODY": "For spontaneous YouTube sessions with playlists and built-in chat, Watch2Gether is the best choice. For premium streaming platforms (like Netflix, Prime Video, Disney+), self-hosted servers (Jellyfin, Plex, Emby), and maximum browser flexibility, KoalaSync is the more suitable and lightweight tool.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener: Which watch party platform fits better?",
"ALT_SCENER_META_DESC": "An honest comparison of KoalaSync and Scener. Discover when Scener's webcam chat wins and why KoalaSync is best for distraction-free movie nights.",
"ALT_SCENER_INTRO": "KoalaSync and Scener approach watch parties from two completely different angles. Scener is a virtual movie theater with built-in video chat and interactive rooms. KoalaSync, on the other hand, is a minimalist, privacy-friendly browser extension that simply synchronizes playback controls. Which tool fits you best depends mostly on how important built-in webcam and chat features are to you.",
"ALT_SCENER_WHEN_SCENER_TITLE": "When Scener is the better choice",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener is a solid choice if you want an <strong>all-in-one social platform</strong> with built-in video and audio chat directly in your browser. Scener creates a virtual room where the player and your friends' webcams are displayed side-by-side. This is ideal for large, public watch parties or virtual streaming events where the social aspect is front and center. However, keep in mind that the free basic version is ad-supported, and Scener locks many features (such as ad-free viewing and unlimited video chat) behind a monthly subscription ($5.79/month or $39.99/year).",
"ALT_SCENER_WHEN_KOALA_TITLE": "When KoalaSync fits better",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync shines when it comes to <strong>video quality, privacy, and simplicity</strong>:<br><br>• <strong>No accounts</strong>: You don't need to register, log in, or manage profiles. Just activate the extension, share a room code, and start watching.<br>• <strong>True native quality (4K/HDR)</strong>: Scener streams compressed video from a virtual cloud server, which can lead to quality loss and lagging. KoalaSync synchronizes the native player directly on your computer, meaning you watch movies in the full resolution of your streaming subscription.<br>• <strong>Low bandwidth usage</strong>: Because only control data (play, pause, timestamps) is transmitted, KoalaSync uses virtually no extra bandwidth. Scener streams the entire video and camera feeds over cloud servers, which can heavily strain slower internet connections and older laptops.<br>• <strong>100% free and ad-free</strong>: No monthly subscription fees, no advertisements, and no trackers.<br>• <strong>Local video files</strong>: Since KoalaSync runs locally, you can even watch your own video files (like MP4) in sync with friends. Just drag and drop the file into a browser tab Scener cannot do this because its player runs in the cloud.",
"ALT_SCENER_MAIN_DIFF_TITLE": "The main difference",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener is a <strong>commercial social network</strong> for watch parties that is powered by virtual cloud browsers and funded through ads and monthly subscriptions. KoalaSync is a <strong>privacy-first, free synchronization utility</strong> that hooks directly into your browser tabs. It leaves voice/video chat to applications like Discord or Teamspeak, focusing entirely on keeping your playback fluid, private, and in its native original quality.",
"ALT_SCENER_LIMITS_TITLE": "Honest limitations",
"ALT_SCENER_LIMITS_BODY": "KoalaSync offers <strong>no built-in chat or webcam support</strong>. It is purely a synchronization tool and requires a separate voice call tool of your choice. Additionally, KoalaSync is currently desktop-only, and local video file compatibility depends entirely on whether your browser natively supports playing the video format and audio codecs.",
"ALT_SCENER_SUMMARY_TITLE": "In short",
"ALT_SCENER_SUMMARY_BODY": "For large watch parties with built-in webcam chat and social features, Scener is the right choice, provided you don't mind ads and premium paywalls. If you want a completely free, ad-free, and distraction-free experience in the native player (including Netflix, Prime Video, Disney+, or local browser files) and you are already in a voice call, KoalaSync is the cleaner and more performant solution.",
"ALT_KOSMI_TITLE": "KoalaSync vs Kosmi: Which Netflix party alternative fits better?",
"ALT_KOSMI_META_DESC": "An honest comparison of KoalaSync and Kosmi. Discover why Kosmi's no-extension setup is convenient and when KoalaSync's native video quality wins.",
"ALT_KOSMI_INTRO": "Both KoalaSync and Kosmi offer great ways to watch Netflix, YouTube, and other platforms in sync with friends. However, their underlying technologies are fundamentally different. Kosmi uses virtual cloud browsers that run directly in your web browser without installing extensions. KoalaSync is a lightweight extension that synchronizes your local video player. Which approach fits you best depends on your priorities regarding video quality, convenience, and privacy.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "When Kosmi is the better choice",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi is unbeatable if you want to <strong>avoid installing anything</strong> or want to watch on devices like tablets and smartphones. Because Kosmi runs virtual browsers in the cloud, all it takes to join is a simple web link. Furthermore, Kosmi is an all-in-one hangout platform: in addition to synchronized streaming, you can play multiplayer games (like retro NES/SNES classics or poker) and use the built-in webcam, voice, and text chat. If you want a social game night and watch party without setup, Kosmi is a fantastic solution.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "When KoalaSync fits better",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync shines when it comes to <strong>native playback quality, security, and performance</strong>:<br><br>• <strong>No security risks</strong>: With Kosmi, you have to log into your Netflix or Prime account on a remote virtual computer in the cloud. With KoalaSync, you log in securely on the official streaming website in your own browser, just like you normally do. Your passwords never leave your machine.<br>• <strong>Full video quality (4K/HDR)</strong>: Kosmi streams the virtual browser's screen as a compressed video feed, which can result in pixelation and buffering. KoalaSync syncs the native players locally: you enjoy movies in the full, crystal-clear resolution of your subscription.<br>• <strong>Lag-free & bandwidth-friendly</strong>: Since KoalaSync only sends control commands (play/pause/timestamps), it uses almost zero bandwidth. Kosmi constantly streams HD video feeds, which can overwhelm slower connections.<br>• <strong>Local video files</strong>: If you want to watch a private video, just drag and drop the MP4 file into a browser tab and sync it. Kosmi cannot access files on your local hard drive.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "The main difference",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi is a <strong>virtual cloud hangout</strong> that streams a remote browser's screen so no one has to install an extension. KoalaSync is a <strong>local browser sync layer</strong> that hooks directly into the native player on the official streaming website. While Kosmi is more versatile for mini-games and device compatibility, KoalaSync offers a more secure, fluid, and sharp streaming experience in the original player.",
"ALT_KOSMI_LIMITS_TITLE": "Honest limitations",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync <strong>requires installing a browser extension</strong> and currently only runs on desktop PCs. It <strong>has no built-in chat or webcams</strong>, as it is designed under the assumption that you are already talking via Discord or other voice tools anyway. It also does not offer built-in games.",
"ALT_KOSMI_SUMMARY_TITLE": "In short",
"ALT_KOSMI_SUMMARY_BODY": "For casual game nights with retro classics and easy access on mobile devices without any installation, Kosmi is ideal. For premium movie nights on Netflix, Prime Video, Disney+, or Plex in full 4K quality, with maximum security and minimal bandwidth impact, KoalaSync is the clear winner.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven: Which watch party solution fits better?",
"ALT_TWOSEVEN_META_DESC": "An honest comparison of KoalaSync and TwoSeven. Discover when TwoSeven's built-in webcam wins and why KoalaSync is best for Disney+ and Netflix.",
"ALT_TWOSEVEN_INTRO": "Both KoalaSync and TwoSeven use the same basic approach for watch parties: they synchronize the original video player directly in your browser, rather than streaming a compressed video feed from the cloud. This ensures top-tier video quality for both tools. However, while TwoSeven is a commercial portal with built-in webcam chat and subscription tiers, KoalaSync remains a minimalist, completely free, and privacy-friendly extension. Find out which service fits you best here.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "When TwoSeven is the better choice",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven is the right choice if you want an <strong>all-in-one solution with integrated webcam and audio chat</strong> directly in your browser. If you want to see your friends while watching without having to run Discord or Teamspeak in the background, TwoSeven offers this integration natively. Additionally, it works for YouTube and a few open web video players without extensions. It is well-suited for small groups of 2 to 3 people who want to share a visual connection while viewing.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "When KoalaSync fits better",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync shines with its <strong>complete lack of fees, privacy, and simplicity</strong>:<br><br>• <strong>No paywalls</strong>: To watch premium services like Disney+ or Hulu in sync on TwoSeven, at least one room member must support them on Patreon (starting at $3/month). KoalaSync synchronizes Netflix, Prime Video, Disney+, and self-hosted media servers (Jellyfin, Plex, Emby) 100% free with zero restrictions.<br>• <strong>Absolute privacy (No trackers/ads)</strong>: TwoSeven is ad-supported and uses multiple trackers from Google, Facebook, and others. KoalaSync has no ads, no trackers, and communicates exclusively with the RAM-only relay server.<br>• <strong>No registration required</strong>: TwoSeven requires all participants to create an account and log in. KoalaSync is completely account-free. Just install, enter a room code, and start watching.<br>• <strong>Lightweight and resource-friendly</strong>: TwoSeven's integrated webcam and audio feeds place a heavy load on your CPU and network. By leaving communication to tools like Discord, KoalaSync runs extremely smoothly and preserves battery life.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "The main difference",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven is a <strong>commercial platform</strong> with registration requirements, ads, peer-to-peer webcam chats, and Patreon paywalls for specific streaming services. KoalaSync is a <strong>free, open-source utility</strong> that hooks directly into your browser tabs without accounts, trackers, or extra costs, allowing for distraction-free watching in the native player.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Honest limitations",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync offers <strong>no built-in webcam or audio chat</strong> and assumes that you are already on a call via Discord or a similar tool. Additionally, KoalaSync has no built-in chat box overlay and is currently desktop-only.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "In short",
"ALT_TWOSEVEN_SUMMARY_BODY": "For small groups of two or three people who want to see each other via webcams directly in the browser and don't mind supporting a Patreon for Disney+ support, TwoSeven is a nice option. For ad-free, completely free, and private movie nights in native 4K quality (whether Netflix, Prime Video, Disney+, or Jellyfin) without registrations, KoalaSync is the cleaner and safer choice.",
"ALT_TRY_KOALASYNC": "Try KoalaSync",
"MOCK_HOST_CONTROL_LABEL": "Host Control",
"MOCK_HOST_CONTROL_TOGGLE": "Only I can control playback",
"LABEL_SELECT_VIDEO": "Select Video",
"OPTION_SELECT_TAB": "-- Select a Tab --",
"THEME_TOGGLE_LABEL": "Toggle light/dark mode",
"FAQ_SHOW_ALL": "Show all questions",
"FAQ_HIDE_ALL": "Hide questions",
"SELF_SHOW_SETUP": "Show setup guide",
"SELF_HIDE_SETUP": "Hide setup guide",
"HERO_TRUST": "Free · Open source · No account needed",
"COMP_MORE_GUIDES": "Full comparison and more alternatives"
}
+107 -27
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "es_ES",
"META_TITLE": "KoalaSync | Sincroniza Netflix, YouTube y cualquier video con amigos",
"META_DESCRIPTION": "Mira Netflix, YouTube, Twitch y cualquier video HTML5 en perfecta sincronización con amigos. Extensión de navegador gratuita, de código abierto y sin necesidad de registro.",
"SCHEMA_APP_DESC": "Mira Netflix, YouTube, Twitch y cualquier video HTML5 en perfecta sincronización con amigos. Extensión de navegador gratuita, de código abierto y sin necesidad de registro.",
"OG_TITLE": "KoalaSync | Sincroniza Netflix, Emby, Jellyfin y casi cualquier video con amigos",
"OG_DESCRIPTION": "Mira Netflix, Emby, Jellyfin, YouTube, Twitch y casi cualquier video HTML5 en perfecta sincronización. Extensión de navegador de código abierto y respetuosa con la privacidad para Chrome y Firefox.",
"TWITTER_TITLE": "KoalaSync | Sincroniza Netflix, Emby, Jellyfin y casi cualquier video con amigos Extensión de navegador",
"TWITTER_DESCRIPTION": "Mira Netflix, Emby, Jellyfin, YouTube, Twitch y casi cualquier video HTML5 en perfecta sincronización con amigos. Extensión de navegador de código abierto y respetuosa con la privacidad para Chrome y Firefox.",
"META_TITLE": "KoalaSync | Watch party para Netflix, YouTube y s",
"META_DESCRIPTION": "Watch party en Netflix, YouTube, Twitch y cualquier vídeo HTML5. Extensión gratuita y open source para Chrome y Firefox. Sin cuenta, sin rastreo, sin anuncios.",
"SCHEMA_APP_DESC": "Watch party en Netflix, YouTube, Twitch y cualquier vídeo HTML5. Extensión gratuita y open source para Chrome y Firefox. Sin cuenta, sin rastreo, sin anuncios.",
"OG_TITLE": "KoalaSync | Watch party para Netflix, Emby, Jellyfin y casi cualquier vídeo",
"OG_DESCRIPTION": "Organiza una watch party en Netflix, Emby, Jellyfin, YouTube, Twitch y casi cualquier vídeo HTML5. Open source, privada y sin cuenta.",
"TWITTER_TITLE": "KoalaSync | Watch party para Netflix, Emby, Jellyfin y casi cualquier vídeo Extensión",
"TWITTER_DESCRIPTION": "Organiza una watch party en Netflix, Emby, Jellyfin, YouTube, Twitch y casi cualquier vídeo HTML5. Open source, privada y sin cuenta.",
"NAV_FEATURES": "Características",
"NAV_HOW_IT_WORKS": "Cómo funciona",
"HERO_TITLE": "Miren juntos.<span class='hero-line2'>Sincronización perfecta.</span>",
"HERO_SUBTITLE": "Tu noche de películas a distancia sin retrasos. Sin registros ni recopilación de datos. Solo comparte un enlace y miren juntos.",
"HERO_TITLE": "Convierte cualquier vídeo en una <span class='hero-highlight'>watch party</span>.",
"HERO_SUBTITLE": "Tu noche de cine a distancia, sin retrasos. Sin cuenta, sin rastreo, sin anuncios. Comparte un enlace y dale al play juntos.",
"HERO_MASCOT_ALT": "Un lindo koala de pie mirando hacia abajo a los botones de descarga",
"DEMO_SYNC": "Sincronizado",
"DEMO_HINT": "Demo en vivo: pulsa play en cualquiera de las pestañas y KoalaSync mantiene ambas sincronizadas.",
"DEMO_NO_ROOM": "Aún sin conexión",
"DEMO_CREATE_ROOM": "Crear sala",
"DEMO_JOINED": "Conectado a la sala",
"DEMO_TAB_SELECTED": "Pestaña seleccionada",
"DEMO_SELECT_PLACEHOLDER": "Elige una pestaña de video…",
"MOBILE_DEMO_CTA": "Ver cómo funciona",
"MOBILE_DEMO_TITLE": "Demo en vivo de KoalaSync",
"MOBILE_DEMO_CLOSE": "Cerrar demo",
"ADD_TO_CHROME": "Añadir a Chrome",
"ADD_TO_FIREFOX": "Añadir a Firefox",
"COMPAT_HEADING": "Funciona en tus plataformas favoritas",
@@ -35,20 +45,20 @@
"USE_CASE_3_DESC": "Reduce la distancia y disfruta de noches de citas. Vive cada giro de la trama, ríete de los mismos chistes y comparte momentos emotivos en el mismo milisegundo exacto.",
"WHY_TITLE": "¿Por qué KoalaSync?",
"WHY_SUBTITLE": "Diseñado para una sincronización confiable, con la privacidad como prioridad y una configuración sencilla.",
"FEATURE_1_TITLE": "Control total / Sincronización instantánea",
"FEATURE_1_DESC": "Si uno pausa, todos pausan. Si uno avanza, todos le siguen. Nuestro protocolo de sincronización en dos fases coordina la reproducción en tiempo real para todos los participantes.",
"FEATURE_1_TITLE": "Control del host y sincronización",
"FEATURE_1_DESC": "Tú decides quién controla la reproducción. Activa el control del anfitrión para que solo tú puedas pausar y avanzar, o asigna coanfitriones.",
"FEATURE_2_TITLE": "Maratones sin fin",
"FEATURE_2_DESC": "Reproducción automática sincronizada. KoalaSync detecta automáticamente los cambios de episodio y detiene la reproducción hasta que todos los participantes hayan cargado el siguiente video.",
"FEATURE_3_TITLE": "Sin cuentas / Privacidad absoluta",
"FEATURE_3_DESC": "Sin registros, sin seguimiento y sin dejar huella. El servidor funciona completamente en RAM efímera y elimina tu sala en cuanto te vas.",
"FEATURE_4_TITLE": "Soporte universal HTML5",
"FEATURE_4_DESC": "Funciona en YouTube, Twitch, Netflix, Jellyfin, Emby y casi cualquier página web estándar con un reproductor HTML5. También es compatible con configuraciones propias. Nunca enviamos datos de vídeo a nuestros servidores, solo metadatos de sincronización.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby y casi cualquier página con vídeo HTML5. Solo salen las señales de sincronización, nunca el vídeo.",
"FEATURE_5_TITLE": "Auto-alojable y listo para Docker",
"FEATURE_5_DESC": "Nuestros servidores oficiales son gratuitos y rápidos, pero puedes tomar el control total si lo deseas. Inicia tu propio servidor de retransmisión privado en segundos mediante Docker.",
"FEATURE_6_TITLE": "Invitaciones al instante / Unirse con un clic",
"FEATURE_6_DESC": "Sin intercambio de direcciones IP o contraseñas. Comparte un enlace de invitación generado para que tus amigos se unan automáticamente a tu sala con un solo clic.",
"FEATURE_7_TITLE": "Nivelación de volumen / Compresor de audio",
"FEATURE_7_DESC": "Se acabó el tener que ajustar el volumen constantemente. El compresor de audio integrado realza los diálogos bajos y suaviza las explosiones fuertes. Funciona en Netflix, Prime Video, Disney+, YouTube y cualquier video HTML5. Funciona de forma local: ningún dato de audio sale de tu equipo.",
"FEATURE_7_DESC": "Se acabó ajustar el volumen. Un compresor integrado sube los diálogos bajos y suaviza las explosiones fuertes, todo procesado localmente en tu navegador.",
"FEATURE_8_TITLE": "Código Abierto (Licencia MIT)",
"FEATURE_8_DESC": "Todo el código fuente es público y auditable en GitHub. Sin cajas negras ni software propietario: transparencia total desde el servidor de retransmisión hasta la extensión del navegador.",
"COMP_TITLE": "KoalaSync vs Teleparty",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Políticas de privacidad y recopilación de datos de Teleparty:",
"COMP_FOOTNOTE_4": "Funciona en sitios web que permiten inyecciones de scripts en etiquetas de video HTML5 estándar. Los sitios con políticas de seguridad (CSP) muy estrictas, protección DRM o reproductores ofuscados (como DOMs de sombra complejos) pueden restringir el control automático.",
"STEPS_TITLE": "Cómo empezar",
"STEP_1_TITLE": "Instalar la extensión",
"STEP_1_DESC": "Añade KoalaSync a tu navegador desde la Chrome Web Store, complementos de Firefox o descarga el archivo ZIP para desarrolladores desde GitHub.",
"STEP_1_ILLUS_DESC": "Sincronizador de video privado",
"STEP_1_ILLUS_DL_CHROME": "Descargar para Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Descargar para Firefox",
"STEP_1_ILLUS_ACTIVE": "Extensión activa",
"STEP_1_ILLUS_READY": "¡Listo para ver juntos!",
"STEP_2_TITLE": "Crear una sala",
"STEP_2_DESC": "Abre el menú de la extensión y haz clic en '+ Crear nueva sala'. KoalaSync generará automáticamente un ID de sala y una contraseña seguros, se conectará y copiará el enlace al portapapeles.",
"STEP_1_TITLE": "Crear y compartir sala",
"STEP_1_DESC": "Abre la extensión, crea una sala con un clic y comparte el enlace con tus amigos. Se unirán al instante a través del enlace de invitación.",
"STEP_1_ILLUS_DESC": "Elige una pestaña para vincular",
"STEP_1_ILLUS_DL_CHROME": "Vincular pestaña de YouTube",
"STEP_1_ILLUS_DL_FIREFOX": "Vincular pestaña de Netflix",
"STEP_1_ILLUS_ACTIVE": "Pestaña vinculada",
"STEP_1_ILLUS_READY": "Listo para ver en sincronía!",
"STEP_2_TITLE": "Seleccionar pestaña de vídeo",
"STEP_2_DESC": "Ve a la pestaña de tu vídeo y selecciónala en el menú de la extensión. KoalaSync vinculará vuestros reproductores automáticamente.",
"STEP_2_ILLUS_ROOM": "Sala",
"STEP_2_ILLUS_SYNC": "Sincro",
"STEP_2_ILLUS_SETTINGS": "Ajustes",
"STEP_2_ILLUS_CREATE": "+ Crear nueva sala",
"STEP_2_ILLUS_MANUAL": "Conexión manual / Avanzado",
"STEP_2_ILLUS_COPIED": "¡Enlace de invitación copiado!",
"STEP_3_TITLE": "Compartir y Sincronizar",
"STEP_3_DESC": "Envía el enlace de invitación a tus amigos. Una vez que se unan, selecciona tu pestaña de video y disfrutad de la reproducción sincronizada.",
"STEP_3_TITLE": "Disfrutar de la sincronización",
"STEP_3_DESC": "Pulsa reproducir. Cuando alguien pause, avance o reproduzca, el vídeo de todos se mantendrá en sincronía en tiempo real y sin retrasos.",
"STEP_3_ILLUS_IN_SYNC": "SINCRONIZADO",
"SELF_TITLE": "Para auto-alojadores",
"SELF_SUBTITLE": "¿No te fías de nuestro servidor? Mantén la soberanía total de tus datos. Despliega tu propio servidor de retransmisión en minutos.",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SINCRO",
"MOCK_14": "Ir a la posición de otros",
"MOCK_15": "Estado de la última actividad",
"MOCK_16": "Esperando a 1 participante (KoalaPC)...",
"MOCK_16": "Esperando a 1 participante (🐶 HappyDog)...",
"MOCK_17": "Omitir y reproducir ya",
"MOCK_18": "Tu nombre de usuario",
"MOCK_19": "Ocultar pestañas sin video",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync no está afiliado, respaldado ni asociado con Netflix, Disney+, Amazon, YouTube, Twitch ni ninguna otra plataforma de streaming. Todas las marcas comerciales pertenecen a sus respectivos dueños.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync - Alternativas y comparativas",
"ALT_INDEX_META_DESC": "Explora comparativas honestas y guías detalladas entre KoalaSync y otras extensiones de watch party y soluciones de streaming.",
"ALT_INDEX_HEADING": "Guías y comparativas",
"ALT_INDEX_INTRO": "¿Cómo se compara KoalaSync con otras herramientas de watch party y soluciones de streaming? Lee nuestras comparativas honestas y técnicas para encontrar la mejor opción para tus noches de cine a distancia.",
"ALT_INDEX_READ_COMPARISON": "Leer comparativa →",
"ALT_INDEX_READ_GUIDE": "Leer guía →",
"ALT_INDEX_FOOTER_LINK": "Guías y comparativas",
"ALT_TELEPARTY_TITLE": "KoalaSync frente a Teleparty: ¿qué herramienta de visionado conjunto deberías usar?",
"ALT_TELEPARTY_META_DESC": "Una comparativa práctica entre KoalaSync y Teleparty para ver contenido en grupo, analizando aspectos como el chat integrado, la compatibilidad móvil, la sincronización de vídeo en el navegador, los servidores multimedia autohospedados y el uso de código abierto.",
"ALT_TELEPARTY_INTRO": "Tanto KoalaSync como Teleparty ayudan a resolver el mismo problema molesto: ver algo juntos sin tener que recurrir a la típica rutina de «3, 2, 1, ¡reproducir!». Simplemente adoptan enfoques diferentes.<br><br>Teleparty es la opción más lógica si buscas un chat integrado o si quieres ver contenido desde un dispositivo móvil. KoalaSync está más orientado a sesiones de visionado en navegadores de escritorio, donde ya te comunicas a través de Discord, Teamspeak u otra aplicación de voz y solo necesitas que la reproducción se mantenga sincronizada.<br><br>La razón principal por la que creé KoalaSync fue la flexibilidad. Está diseñado para funcionar con casi cualquier sitio web que utilice un reproductor de vídeo estándar de navegador, no solo con una lista fija de plataformas. Esto incluye configuraciones autohospedadas como Emby, Jellyfin y Plex, dominios locales o privados y muchas páginas de vídeo convencionales.",
@@ -191,7 +208,7 @@
"ALT_TELEPARTY_LIMITS_TITLE": "Limitaciones reales",
"ALT_TELEPARTY_LIMITS_BODY": "KoalaSync no hace milagros ni pretende ocultar sus limitaciones. Actualmente, solo funciona en navegadores de escritorio; no cuenta con chat integrado ni aplicación móvil.<br><br>La compatibilidad también depende del navegador y del reproductor de vídeo utilizado. Aunque KoalaSync debería funcionar con casi cualquier reproductor estándar de navegador, los sitios web pueden modificar sus reproductores, el comportamiento del DRM o las restricciones del navegador en cualquier momento.<br><br>KoalaSync no tiene ninguna relación con Netflix, Disney+, Prime Video, YouTube, Teleparty, Emby, Jellyfin, Plex ni ninguna otra marca mencionada aquí. Dichos nombres se utilizan únicamente para ilustrar casos de uso habituales.",
"ALT_TELEPARTY_SUMMARY_TITLE": "Resumen",
"ALT_TELEPARTY_SUMMARY_BODY": "Si buscas chat integrado o compatibilidad con dispositivos móviles, Teleparty podría ser la mejor opción. Si prefieres una solución gratuita y de código abierto para sincronizar navegadores de escritorio que funcione con casi cualquier reproductor de vídeo convencional incluidos servidores multimedia de alojamiento propio como Emby, Jellyfin y Plex, KoalaSync es probablemente la alternativa más adecuada.",
"ALT_TELEPARTY_SUMMARY_BODY": "Si buscas chat integrado o compatibilidad con dispositivos móviles, Teleparty podría ser la mejor opción. Si prefieres una solución gratuita y de código abierto para sincronizar navegadores de escritorio que funcione con casi cualquier reproductor de vídeo convencional, incluidos servidores multimedia de alojamiento propio como Emby, Jellyfin y Plex, KoalaSync es probablemente la alternativa más adecuada.",
"ALT_SCREEN_TITLE": "KoalaSync frente a compartir pantalla: ¿cuándo es mejor la sincronización de vídeo?",
"ALT_SCREEN_META_DESC": "Una comparativa práctica entre KoalaSync y la función de compartir pantalla para noches de cine a distancia, analizando aspectos como el control de reproducción, la calidad de vídeo, la privacidad, los subtítulos y la visualización desde el navegador.",
"ALT_SCREEN_INTRO": "Compartir pantalla funciona y, sinceramente, a veces es suficiente. Una persona comparte su pantalla, las demás la ven y listo.<br><br>Sin embargo, para sesiones de cine más largas o para ver episodios en grupo, puede resultar molesto. La calidad del vídeo depende de la velocidad de subida, la CPU y el navegador de quien comparte, así como de la compresión que apliquen aplicaciones como Discord, Teamspeak, Zoom u otras plataformas de videollamada. Además, solo una persona tiene el control real de la reproducción.",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSync no sustituye a una llamada de voz. Si quieres hablar mientras ves el contenido, puedes seguir usando Discord, Teamspeak, Signal, WhatsApp o cualquier otra herramienta que utilices habitualmente.<br><br>Además, cada participante necesita acceder al vídeo o a la página web desde su propio dispositivo. KoalaSync no elude suscripciones, inicios de sesión, DRM, restricciones regionales ni las normas de las plataformas.<br><br>Actualmente solo funciona en navegadores de escritorio, no incluye funciones de chat o voz, y la compatibilidad depende siempre del navegador y del reproductor de vídeo.",
"ALT_SCREEN_SUMMARY_TITLE": "Resumen",
"ALT_SCREEN_SUMMARY_BODY": "Compartir pantalla es la opción más sencilla cuando buscas algo rápido y no te preocupa demasiado la calidad, la privacidad o el control individual. KoalaSync es una mejor alternativa cuando cada persona debe ver el contenido localmente en su propio navegador y se busca una experiencia que realmente se asemeje a verlo juntos.",
"ALT_TRY_KOALASYNC": "Prueba KoalaSync"
"ALT_W2G_TITLE": "KoalaSync vs Watch2Gether: ¿Qué solución de fiesta de visualización se adapta mejor?",
"ALT_W2G_META_DESC": "Una comparación honesta entre KoalaSync y Watch2Gether. Descubra cuándo la flexibilidad de KoalaSync es inmejorable y por qué Watch2Gether sigue siendo la mejor opción para YouTube.",
"ALT_W2G_INTRO": "KoalaSync y Watch2Gether resuelven el mismo problema: ver vídeos sincronizados con amigos en línea sin coordinarlos manualmente. Si bien Watch2Gether es uno de los centros más antiguos y populares para noches de películas compartidas, KoalaSync adopta un enfoque liviano y completamente diferente. La herramienta adecuada para usted depende en gran medida de qué y dónde desea mirar.",
"ALT_W2G_WHEN_W2G_TITLE": "Cuando Watch2Gether es la mejor opción",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether es inmejorable para las <strong>fiestas de visualización de YouTube</strong>. Con su lista de reproducción y búsqueda integradas, cualquier persona en la sala puede buscar, agregar y reproducir nuevos videos fácilmente. Todos ven el siguiente video juntos sin problemas.<br><br>Con KoalaSync en YouTube, la reproducción automática predeterminada del sitio toma el control y redirige a cada usuario a un video recomendado diferente. Nuestra función automática del siguiente episodio (\"Episode Lobby\"), que funciona muy bien en Netflix o Disney+, no funciona en YouTube debido a estas recomendaciones dinámicas. Para las noches puramente de YouTube, Watch2Gether es la mejor opción.",
"ALT_W2G_WHEN_KOALA_TITLE": "Cuando KoalaSync se adapta mejor",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync brilla en <strong>servicios de streaming reales</strong> (Netflix, Prime Video, Disney+) y servidores de medios autohospedados (Jellyfin, Plex, Emby). A diferencia de Watch2Gether, que a menudo no puede reproducir ningún contenido premium, KoalaSync sincroniza el reproductor nativo directamente en el sitio web.<br><br>Funciona en casi cualquier sitio con un reproductor de vídeo HTML5 estándar. No es necesario configurar una sala virtual en un sitio de terceros: simplemente active la extensión, únase a un lobby y comience a mirar.",
"ALT_W2G_MAIN_DIFF_TITLE": "La principal diferencia",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether es un <strong>sitio web independiente</strong> con chat integrado, listas de reproducción y soporte para cámara web. KoalaSync es una <strong>extensión de navegador minimalista</strong> que se conecta directamente a las pestañas normales de tu navegador.<br><br>¿Buscas un paquete todo en uno para YouTube con chat integrado? Utilice Watch2Gether. ¿Quieres ver películas en Netflix o en tu propio servidor sin distracciones, en calidad nativa (sin compresión del servidor)? KoalaSync es la solución más limpia.",
"ALT_W2G_LIMITS_TITLE": "Limitaciones honestas",
"ALT_W2G_LIMITS_BODY": "KoalaSync <strong>no tiene listas de reproducción ni búsqueda de vídeos integradas</strong>. En YouTube, esto significa que la reproducción automática del siguiente vídeo no permanecerá sincronizada.<br><br>Además, <strong>no hay chat integrado</strong> y KoalaSync actualmente solo funciona en navegadores de escritorio. Está diseñado bajo el supuesto de que ya estás hablando a través de Discord, Teamspeak u otras herramientas de voz de todos modos.",
"ALT_W2G_SUMMARY_TITLE": "En breve",
"ALT_W2G_SUMMARY_BODY": "Para sesiones espontáneas de YouTube con listas de reproducción y chat integrado, Watch2Gether es la mejor opción. Para plataformas de streaming premium (como Netflix, Prime Video, Disney+), servidores autohospedados (Jellyfin, Plex, Emby) y máxima flexibilidad del navegador, KoalaSync es la herramienta más adecuada y ligera.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener: ¿Qué plataforma de watch party se adapta mejor?",
"ALT_SCENER_META_DESC": "Una comparación honesta de KoalaSync y Scener. Descubra cuándo gana el chat con cámara web de Scener y por qué KoalaSync es mejor para noches de cine sin distracciones.",
"ALT_SCENER_INTRO": "KoalaSync y Scener abordan las fiestas de visualización desde dos ángulos completamente diferentes. Scener es una sala de cine virtual con video chat integrado y salas interactivas. KoalaSync, por otro lado, es una extensión de navegador minimalista y respetuosa con la privacidad que simplemente sincroniza los controles de reproducción. La herramienta que mejor se adapte a sus necesidades depende principalmente de la importancia que tengan para usted las funciones integradas de cámara web y chat.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Cuando Scener es la mejor opción",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener es una opción sólida si desea una <strong>plataforma social todo en uno</strong> con chat de audio y video integrado directamente en su navegador. Scener crea una sala virtual donde el reproductor y las cámaras web de tus amigos se muestran una al lado de la otra. Esto es ideal para grandes fiestas públicas o eventos de transmisión virtual donde el aspecto social está al frente y al centro. Sin embargo, tenga en cuenta que la versión básica gratuita cuenta con publicidad y Scener bloquea muchas funciones (como visualización sin publicidad y video chat ilimitado) detrás de una suscripción mensual ($5,79/mes o $39,99/año).",
"ALT_SCENER_WHEN_KOALA_TITLE": "Cuando KoalaSync se adapta mejor",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync brilla cuando se trata de <strong>calidad de vídeo, privacidad y simplicidad</strong>:<br><br>• <strong>Sin cuentas</strong>: no es necesario registrarse, iniciar sesión ni administrar perfiles. Simplemente active la extensión, comparta un código de sala y comience a mirar.<br>• <strong>Calidad nativa verdadera (4K/HDR)</strong>: Scener transmite video comprimido desde un servidor virtual en la nube, lo que puede provocar pérdida de calidad y retrasos. KoalaSync sincroniza el reproductor nativo directamente en su computadora, lo que significa que puede ver películas en la resolución completa de su suscripción de transmisión.<br>• <strong>Bajo uso de ancho de banda</strong>: debido a que solo se transmiten datos de control (reproducción, pausa, marcas de tiempo), KoalaSync prácticamente no usa ancho de banda adicional. Scener transmite todo el video y las transmisiones de la cámara a través de servidores en la nube, lo que puede sobrecargar las conexiones a Internet más lentas y las computadoras portátiles más antiguas.<br>• <strong>100% gratis y sin publicidad</strong>: sin tarifas de suscripción mensual, sin publicidad ni rastreadores.<br>• <strong>Archivos de video locales</strong>: dado que KoalaSync se ejecuta localmente, incluso puedes ver tus propios archivos de video (como MP4) en sincronización con amigos. Simplemente arrastre y suelte el archivo en una pestaña del navegador; Scener no puede hacer esto porque su reproductor se ejecuta en la nube.",
"ALT_SCENER_MAIN_DIFF_TITLE": "La principal diferencia",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener es una <strong>red social comercial</strong> para grupos de visualización que funciona con navegadores virtuales en la nube y se financia a través de anuncios y suscripciones mensuales. KoalaSync es una <strong>utilidad de sincronización gratuita que prioriza la privacidad</strong> y se conecta directamente a las pestañas de su navegador. Deja el chat de voz/vídeo en manos de aplicaciones como Discord o Teamspeak, centrándose por completo en mantener la reproducción fluida, privada y en su calidad original nativa.",
"ALT_SCENER_LIMITS_TITLE": "Limitaciones honestas",
"ALT_SCENER_LIMITS_BODY": "KoalaSync no ofrece <strong>soporte integrado para chat o cámara web</strong>. Es puramente una herramienta de sincronización y requiere una herramienta de llamada de voz independiente de su elección. Además, KoalaSync actualmente es solo para escritorio y la compatibilidad de archivos de video locales depende completamente de si su navegador admite de forma nativa la reproducción del formato de video y códecs de audio.",
"ALT_SCENER_SUMMARY_TITLE": "En breve",
"ALT_SCENER_SUMMARY_BODY": "Para grandes grupos de visualización con chat con cámara web integrado y funciones sociales, Scener es la opción correcta, siempre que no le importen los anuncios y los muros de pago premium. Si desea una experiencia completamente gratuita, sin publicidad y sin distracciones en el reproductor nativo (incluidos Netflix, Prime Video, Disney+ o archivos del navegador local) y ya está en una llamada de voz, KoalaSync es la solución más limpia y eficaz.",
"ALT_KOSMI_TITLE": "KoalaSync vs Kosmi: ¿Qué alternativa de fiesta de Netflix encaja mejor?",
"ALT_KOSMI_META_DESC": "Una comparación honesta de KoalaSync y Kosmi. Descubra por qué la configuración sin extensiones de Kosmi es conveniente y cuándo gana la calidad de video nativa de KoalaSync.",
"ALT_KOSMI_INTRO": "Tanto KoalaSync como Kosmi ofrecen excelentes formas de ver Netflix, YouTube y otras plataformas sincronizadas con amigos. Sin embargo, sus tecnologías subyacentes son fundamentalmente diferentes. Kosmi utiliza navegadores virtuales en la nube que se ejecutan directamente en su navegador web sin instalar extensiones. KoalaSync es una extensión liviana que sincroniza su reproductor de video local. El enfoque que mejor se adapte a sus necesidades depende de sus prioridades en cuanto a calidad de vídeo, comodidad y privacidad.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Cuando Kosmi es la mejor opción",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi es inmejorable si quieres <strong>evitar instalar nada</strong> o quieres mirar en dispositivos como tabletas y teléfonos inteligentes. Debido a que Kosmi ejecuta navegadores virtuales en la nube, todo lo que se necesita para unirse es un simple enlace web. Además, Kosmi es una plataforma de reunión todo en uno: además de la transmisión sincronizada, puedes jugar juegos multijugador (como clásicos retro de NES/SNES o póquer) y usar la cámara web integrada, el chat de voz y de texto. Si quieres una noche de juegos sociales y una fiesta para ver sin configuración, Kosmi es una solución fantástica.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "Cuando KoalaSync se adapta mejor",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync brilla cuando se trata de <strong>calidad de reproducción nativa, seguridad y rendimiento</strong>:<br><br>• <strong>Sin riesgos de seguridad</strong>: con Kosmi, debes iniciar sesión en tu cuenta de Netflix o Prime en una computadora virtual remota en la nube. Con KoalaSync, inicias sesión de forma segura en el sitio web oficial de transmisión en tu propio navegador, tal como lo haces normalmente. Sus contraseñas nunca salen de su máquina.<br>• <strong>Calidad de vídeo completa (4K/HDR)</strong>: Kosmi transmite la pantalla del navegador virtual como una señal de vídeo comprimida, lo que puede provocar pixelación y almacenamiento en búfer. KoalaSync sincroniza los reproductores nativos localmente: usted disfruta de las películas con la resolución completa y nítida de su suscripción.<br>• <strong>Sin demoras y compatible con el ancho de banda</strong>: dado que KoalaSync solo envía comandos de control (reproducir/pausar/marcas de tiempo), utiliza casi cero ancho de banda. Kosmi transmite constantemente transmisiones de video HD, lo que puede abrumar las conexiones más lentas.<br>• <strong>Archivos de video locales</strong>: si desea ver un video privado, simplemente arrastre y suelte el archivo MP4 en una pestaña del navegador y sincronícelo. Kosmi no puede acceder a los archivos de su disco duro local.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "La principal diferencia",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi es un <strong>lugar virtual en la nube</strong> que transmite la pantalla de un navegador remoto para que nadie tenga que instalar una extensión. KoalaSync es una <strong>capa de sincronización del navegador local</strong> que se conecta directamente al reproductor nativo en el sitio web oficial de streaming. Si bien Kosmi es más versátil en cuanto a minijuegos y compatibilidad con dispositivos, KoalaSync ofrece una experiencia de transmisión más segura, fluida y nítida en el reproductor original.",
"ALT_KOSMI_LIMITS_TITLE": "Limitaciones honestas",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync <strong>requiere la instalación de una extensión del navegador</strong> y actualmente solo se ejecuta en PC de escritorio. <strong>No tiene chat ni cámaras web integrados</strong>, ya que está diseñado bajo el supuesto de que de todos modos ya estás hablando a través de Discord u otras herramientas de voz. Tampoco ofrece juegos integrados.",
"ALT_KOSMI_SUMMARY_TITLE": "En breve",
"ALT_KOSMI_SUMMARY_BODY": "Para noches de juegos casuales con clásicos retro y fácil acceso en dispositivos móviles sin instalación, Kosmi es ideal. Para noches de películas premium en Netflix, Prime Video, Disney+ o Plex en calidad total 4K, con máxima seguridad y mínimo impacto en el ancho de banda, KoalaSync es el claro ganador.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven: ¿Qué solución de fiesta de visualización se adapta mejor?",
"ALT_TWOSEVEN_META_DESC": "Una comparación honesta de KoalaSync y TwoSeven. Descubra cuándo gana la cámara web integrada de TwoSeven y por qué KoalaSync es mejor para Disney+ y Netflix.",
"ALT_TWOSEVEN_INTRO": "Tanto KoalaSync como TwoSeven utilizan el mismo enfoque básico para las fiestas de visualización: sincronizan el reproductor de vídeo original directamente en su navegador, en lugar de transmitir un vídeo comprimido desde la nube. Esto garantiza una calidad de vídeo de primer nivel para ambas herramientas. Sin embargo, si bien TwoSeven es un portal comercial con chat con cámara web integrado y niveles de suscripción, KoalaSync sigue siendo una extensión minimalista, completamente gratuita y respetuosa con la privacidad. Descubra aquí qué servicio se adapta mejor a sus necesidades.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "Cuando TwoSeven es la mejor opción",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven es la elección correcta si desea una <strong>solución todo en uno con cámara web integrada y chat de audio</strong> directamente en su navegador. Si quieres ver a tus amigos mientras miran sin tener que ejecutar Discord o Teamspeak en segundo plano, TwoSeven ofrece esta integración de forma nativa. Además, funciona para YouTube y algunos reproductores de vídeo web abiertos sin extensiones. Es ideal para grupos pequeños de 2 a 3 personas que quieran compartir una conexión visual mientras miran.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "Cuando KoalaSync se adapta mejor",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync brilla por su <strong>falta total de tarifas, privacidad y simplicidad</strong>:<br><br>• <strong>Sin muros de pago</strong>: para ver servicios premium como Disney+ o Hulu sincronizados en TwoSeven, al menos un miembro de la sala debe apoyarlos en Patreon (a partir de $3/mes). KoalaSync sincroniza Netflix, Prime Video, Disney+ y servidores multimedia autohospedados (Jellyfin, Plex, Emby) de forma 100 % gratuita y sin restricciones.<br>• <strong>Privacidad absoluta (sin rastreadores ni anuncios):</strong> TwoSeven cuenta con publicidad y utiliza múltiples rastreadores de Google, Facebook y otros. KoalaSync no tiene anuncios ni rastreadores y se comunica exclusivamente con el servidor de retransmisión de solo RAM.<br>• <strong>No es necesario registrarse</strong>: TwoSeven requiere que todos los participantes creen una cuenta e inicien sesión. KoalaSync no tiene ninguna cuenta. Simplemente instálelo, ingrese un código de sala y comience a mirar.<br>• <strong>Ligero y con pocos recursos</strong>: la cámara web integrada y las transmisiones de audio de TwoSeven suponen una gran carga para su CPU y su red. Al dejar la comunicación en manos de herramientas como Discord, KoalaSync funciona de manera extremadamente fluida y preserva la duración de la batería.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "La principal diferencia",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven es una <strong>plataforma comercial</strong> con requisitos de registro, anuncios, chats con cámara web de igual a igual y muros de pago de Patreon para servicios de transmisión específicos. KoalaSync es una <strong>utilidad gratuita de código abierto</strong> que se conecta directamente a las pestañas de su navegador sin cuentas, rastreadores ni costos adicionales, lo que permite mirar contenido sin distracciones en el reproductor nativo.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Limitaciones honestas",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync no ofrece <strong>cámara web ni chat de audio integrados</strong> y asume que ya estás en una llamada a través de Discord o una herramienta similar. Además, KoalaSync no tiene un cuadro de chat superpuesto incorporado y actualmente es solo para escritorio.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "En breve",
"ALT_TWOSEVEN_SUMMARY_BODY": "Para grupos pequeños de dos o tres personas que quieren verse a través de cámaras web directamente en el navegador y no les importa apoyar a Patreon para Disney+, TwoSeven es una buena opción. Para noches de cine privadas, completamente gratuitas y sin publicidad en calidad nativa 4K (ya sea Netflix, Prime Video, Disney+ o Jellyfin) sin registros, KoalaSync es la opción más limpia y segura.",
"ALT_TRY_KOALASYNC": "Prueba KoalaSync",
"MOCK_HOST_CONTROL_LABEL": "Control del anfitrión",
"MOCK_HOST_CONTROL_TOGGLE": "Solo yo puedo controlar la reproducción",
"LABEL_SELECT_VIDEO": "Seleccionar video",
"OPTION_SELECT_TAB": "-- Selecciona una pestaña --",
"THEME_TOGGLE_LABEL": "Cambiar modo claro/oscuro",
"FAQ_SHOW_ALL": "Mostrar todas las preguntas",
"FAQ_HIDE_ALL": "Ocultar preguntas",
"SELF_SHOW_SETUP": "Mostrar guía de instalación",
"SELF_HIDE_SETUP": "Ocultar guía de instalación",
"HERO_TRUST": "Gratis · Código abierto · Sin cuenta",
"COMP_MORE_GUIDES": "Comparativa completa y más alternativas"
}
+112 -32
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "fr_FR",
"META_TITLE": "KoalaSync | Synchronisez Netflix, YouTube et n'importe quelle vidéo avec vos amis",
"META_DESCRIPTION": "Regardez Netflix, YouTube, Twitch et des vidéos HTML5 en synchro avec vos amis. Extension de navigateur gratuite et open-source. Aucune inscription requise.",
"SCHEMA_APP_DESC": "Regardez Netflix, YouTube, Twitch et des vidéos HTML5 en synchro avec vos amis. Extension de navigateur gratuite et open-source. Aucune inscription requise.",
"OG_TITLE": "KoalaSync | Synchronisez Netflix, Emby, Jellyfin et presque toutes les vidéos avec vos amis",
"OG_DESCRIPTION": "Regardez Netflix, Emby, Jellyfin, YouTube, Twitch et presque n'importe quelle vidéo HTML5 en parfaite synchronisation. Extension de navigateur open-source et respectueuse de la vie privée pour Chrome et Firefox.",
"TWITTER_TITLE": "KoalaSync | Synchronisez Netflix, Emby, Jellyfin et presque toutes les vidéos avec vos amis Extension de navigateur",
"TWITTER_DESCRIPTION": "Regardez Netflix, Emby, Jellyfin, YouTube, Twitch et presque n'importe quelle vidéo HTML5 en parfaite synchronisation avec vos amis. Extension de navigateur open-source et respectueuse de la vie privée pour Chrome et Firefox.",
"META_TITLE": "KoalaSync | Watch party pour Netflix, YouTube et plus",
"META_DESCRIPTION": "Organisez une watch party sur Netflix, YouTube, Twitch et toute vidéo HTML5. Extension libre et gratuite pour Chrome et Firefox. Sans compte, sans pistage, sans pub.",
"SCHEMA_APP_DESC": "Organisez une watch party sur Netflix, YouTube, Twitch et toute vidéo HTML5. Extension libre et gratuite pour Chrome et Firefox. Sans compte, sans pistage, sans pub.",
"OG_TITLE": "KoalaSync | Watch party pour Netflix, Emby, Jellyfin et presque toute vidéo",
"OG_DESCRIPTION": "Organisez une watch party sur Netflix, Emby, Jellyfin, YouTube, Twitch et presque toute vidéo HTML5. Open source, privé et sans compte.",
"TWITTER_TITLE": "KoalaSync | Watch party pour Netflix, Emby, Jellyfin et presque toute vidéo Extension",
"TWITTER_DESCRIPTION": "Organisez une watch party sur Netflix, Emby, Jellyfin, YouTube, Twitch et presque toute vidéo HTML5. Open source, privé et sans compte.",
"NAV_FEATURES": "Fonctionnalités",
"NAV_HOW_IT_WORKS": "Comment ça marche",
"HERO_TITLE": "Regardez ensemble.<span class='hero-line2'>Synchronisation parfaite.</span>",
"HERO_SUBTITLE": "Votre soirée cinéma à distance sans décalage. Pas d'inscription, pas de collecte de données. Partagez simplement un lien et regardez ensemble.",
"HERO_TITLE": "Transformez n'importe quelle vidéo en <span class='hero-highlight'>watch party</span>.",
"HERO_SUBTITLE": "Votre soirée ciné à distance, sans décalage. Pas de compte, pas de tracking, pas de pub. Partagez un lien et lancez la lecture ensemble.",
"HERO_MASCOT_ALT": "Un koala mignon debout et regardant vers le bas les boutons de téléchargement",
"DEMO_SYNC": "Synchronisé",
"DEMO_HINT": "Démo interactive : lancez la lecture dans un onglet, KoalaSync garde les deux synchronisés.",
"DEMO_NO_ROOM": "Pas encore connecté",
"DEMO_CREATE_ROOM": "Créer un salon",
"DEMO_JOINED": "Salon rejoint",
"DEMO_TAB_SELECTED": "Onglet sélectionné",
"DEMO_SELECT_PLACEHOLDER": "Choisir un onglet vidéo…",
"MOBILE_DEMO_CTA": "Voir comment ça marche",
"MOBILE_DEMO_TITLE": "Démo live KoalaSync",
"MOBILE_DEMO_CLOSE": "Fermer la démo",
"ADD_TO_CHROME": "Ajouter à Chrome",
"ADD_TO_FIREFOX": "Ajouter à Firefox",
"COMPAT_HEADING": "Fonctionne sur vos plateformes préférées",
@@ -35,20 +45,20 @@
"USE_CASE_3_DESC": "Comblez la distance et profitez de soirées en tête-à-tête. Vivez chaque rebondissement, riez des mêmes blagues et partagez des moments émotionnels à la milliseconde près.",
"WHY_TITLE": "Pourquoi KoalaSync ?",
"WHY_SUBTITLE": "Conçu pour une synchronisation fiable, le respect de la vie privée et une configuration facile.",
"FEATURE_1_TITLE": "Contrôle total / Synchro instantanée",
"FEATURE_1_DESC": "Un joueur met en pause, tout le monde met en pause. Un joueur avance, tout le monde suit. Notre protocole de synchronisation en deux phases coordonne la lecture en temps réel pour tous les participants.",
"FEATURE_1_TITLE": "Contrôle de l'hôte et synchronisation",
"FEATURE_1_DESC": "Vous décidez qui contrôle la lecture. Activez le contrôle de l'hôte pour être le seul à pouvoir mettre en pause et avancer, ou nommez des co-hôtes.",
"FEATURE_2_TITLE": "Binge-watching sans fin",
"FEATURE_2_DESC": "Lecture automatique synchronisée. KoalaSync détecte automatiquement les transitions d'épisodes et suspend la lecture jusqu'à ce que tous les participants aient chargé la vidéo suivante.",
"FEATURE_3_TITLE": "Aucun compte / Vie privée garantie",
"FEATURE_3_DESC": "Pas d'inscription, pas de suivi, pas de stockage de données. Le serveur fonctionne entièrement dans une RAM éphémère et supprime votre salon dès votre départ.",
"FEATURE_4_TITLE": "Support HTML5 universel",
"FEATURE_4_DESC": "Fonctionne sur YouTube, Twitch, Netflix, Jellyfin, Emby et presque n'importe quelle page web standard contenant un élément vidéo HTML5. Également compatible avec les installations personnalisées. Aucune donnée vidéo n'est envoyée à nos serveurs — seules les métadonnées de synchronisation.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby et presque toute page avec une vidéo HTML5. Seuls les signaux de sync quittent le navigateur, jamais la vidéo.",
"FEATURE_5_TITLE": "Hébergeable soi-même & prêt pour Docker",
"FEATURE_5_DESC": "Nos serveurs officiels sont gratuits et rapides, mais vous pouvez prendre le contrôle total si vous le souhaitez. Lancez votre propre serveur relais privé en quelques secondes via Docker.",
"FEATURE_6_TITLE": "Invitations instantanées / Rejoindre en 1 clic",
"FEATURE_6_DESC": "Pas d'adresses IP ou de mots de passe à échanger. Partagez un lien d'invitation généré pour permettre à vos amis de rejoindre automatiquement votre salon en un seul clic.",
"FEATURE_7_TITLE": "Égalisation du volume / Compresseur audio",
"FEATURE_7_DESC": "Fini de jouer avec le bouton du volume. Le compresseur audio intégré booste les dialogues discrets et adoucit les explosions. Fonctionne sur Netflix, Prime Video, Disney+, YouTube et toute vidéo HTML5. Entièrement local — aucune donnée audio ne quitte votre ordinateur.",
"FEATURE_7_DESC": "Fini de jouer avec le bouton du volume. Un compresseur intégré rehausse les dialogues discrets et adoucit les explosions, le tout traité localement.",
"FEATURE_8_TITLE": "Open Source (MIT License)",
"FEATURE_8_DESC": "Tout le code source est publiquement auditable sur GitHub. Pas de boite noire, pas de blob proprietaire - transparence totale du serveur relais a l'extension de navigateur.",
"COMP_TITLE": "KoalaSync vs Teleparty",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Politiques de confidentialité et collecte de données de suivi de Teleparty :",
"COMP_FOOTNOTE_4": "Fonctionne sur les sites web qui autorisent les injections de scripts dans les balises vidéo HTML5 standard. Les sites avec des politiques de sécurité du contenu (CSP) très strictes, une protection contre la copie DRM ou des conteneurs de lecteurs fortement obscurcis (comme des DOM fantômes complexes) peuvent restreindre le contrôle automatisé ou l'injection.",
"STEPS_TITLE": "Pour commencer",
"STEP_1_TITLE": "Installer l'extension",
"STEP_1_DESC": "Ajoutez KoalaSync à votre navigateur depuis le Chrome Web Store, les modules complémentaires de Firefox, ou téléchargez le dernier fichier ZIP développeur depuis GitHub.",
"STEP_1_ILLUS_DESC": "Synchronisateur vidéo respectueux de la vie privée",
"STEP_1_ILLUS_DL_CHROME": "Télécharger pour Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Télécharger pour Firefox",
"STEP_1_ILLUS_ACTIVE": "Extension active",
"STEP_1_ILLUS_READY": "Prêt à regarder ensemble !",
"STEP_2_TITLE": "Créer un salon",
"STEP_2_DESC": "Ouvrez la fenêtre de l'extension et cliquez sur '+ Créer un nouveau salon'. KoalaSync génère automatiquement un identifiant de salon et un mot de passe sécurisés, s'y connecte et copie le lien d'invitation dans votre presse-papiers.",
"STEP_1_TITLE": "Créer et partager un salon",
"STEP_1_DESC": "Ouvrez l'extension, créez un salon en un clic et partagez le lien avec vos amis. Ils rejoindront instantanément via le lien d'invitation.",
"STEP_1_ILLUS_DESC": "Choisir un onglet à lier",
"STEP_1_ILLUS_DL_CHROME": "Lier l'onglet YouTube",
"STEP_1_ILLUS_DL_FIREFOX": "Lier l'onglet Netflix",
"STEP_1_ILLUS_ACTIVE": "Onglet lié",
"STEP_1_ILLUS_READY": "Prêt à regarder en synchronisation !",
"STEP_2_TITLE": "Sélectionner l'onglet vidéo",
"STEP_2_DESC": "Allez sur l'onglet de votre vidéo et sélectionnez-le dans le menu de l'extension. KoalaSync liera vos lecteurs automatiquement.",
"STEP_2_ILLUS_ROOM": "Salon",
"STEP_2_ILLUS_SYNC": "Synchro",
"STEP_2_ILLUS_SETTINGS": "Options",
"STEP_2_ILLUS_CREATE": "+ Créer un nouveau salon",
"STEP_2_ILLUS_MANUAL": "Connexion manuelle / Avancé",
"STEP_2_ILLUS_COPIED": "Lien d'invitation copié !",
"STEP_3_TITLE": "Partager & Synchroniser",
"STEP_3_DESC": "Envoyez le lien d'invitation à vos amis. Dès qu'ils rejoignent, sélectionnez votre onglet vidéo et profitez de la lecture synchronisée.",
"STEP_3_TITLE": "Profiter de la synchronisation",
"STEP_3_DESC": "Lancez la lecture. Si quelqu'un met en pause, avance ou joue, la vidéo de tout le monde reste synchronisée en temps réel sans décalage.",
"STEP_3_ILLUS_IN_SYNC": "SYNCHRONISÉ",
"SELF_TITLE": "Pour l'auto-hébergement",
"SELF_SUBTITLE": "Vous ne faites pas confiance à notre serveur ? Conservez votre souveraineté totale sur les données. Déployez votre propre serveur relais en quelques minutes.",
@@ -116,21 +126,21 @@
"FAQ_TITLE": "Foire aux questions",
"FAQ_SUBTITLE": "Tout ce que vous devez savoir pour regarder des vidéos en parfaite synchronisation.",
"FAQ_Q1": "Puis-je regarder Netflix, Emby ou Jellyfin en synchronisation avec des amis ?",
"FAQ_A1": "Oui ! KoalaSync fonctionne avec Netflix, YouTube, Twitch et tout site avec un lecteur vidéo HTML5 y compris Emby, Jellyfin et les serveurs multimédia auto-hébergés. Installez l'extension, créez un salon, partagez le lien et regardez en parfaite synchronisation.",
"FAQ_A1": "Oui ! KoalaSync fonctionne avec Netflix, YouTube, Twitch et tout site avec un lecteur vidéo HTML5, y compris Emby, Jellyfin et les serveurs multimédia auto-hébergés. Installez l'extension, créez un salon, partagez le lien et regardez en parfaite synchronisation.",
"FAQ_Q_VIDEO_ACCESS": "KoalaSync diffuse-t-il la vidéo à mes amis ?",
"FAQ_A_VIDEO_ACCESS": "Non. KoalaSync ne diffuse, nhéberge, ne partage et ne contourne aucun accès aux contenus vidéo. Chaque personne regarde la vidéo localement dans son propre navigateur et doit disposer de son propre accès au site ou au service de streaming, par exemple son propre compte Netflix. KoalaSync synchronise uniquement les actions de lecture comme lecture, pause et recherche dans la vidéo.",
"FAQ_Q2": "KoalaSync est-il une alternative gratuite à Teleparty ?",
"FAQ_A2": "100 % gratuit et open source sous licence MIT. Aucun niveau premium, aucune fonctionnalité verrouillée, aucune publicité. Contrairement à Teleparty, le serveur relay de KoalaSync fonctionne uniquement en RAM sans collecte de données ni comptes utilisateur.",
"FAQ_A2": "100 % gratuit et open source sous licence MIT. Aucun niveau premium, aucune fonctionnalité verrouillée, aucune publicité. Contrairement à Teleparty, le serveur relay de KoalaSync fonctionne uniquement en RAM, sans collecte de données ni comptes utilisateur.",
"FAQ_Q3": "KoalaSync fonctionne-t-il avec Emby, Jellyfin et les serveurs multimédia auto-hébergés ?",
"FAQ_A3": "Oui. KoalaSync détecte tout élément vidéo HTML5 standard et fonctionne parfaitement avec Emby, Jellyfin, Plex et toute configuration de streaming personnalisée. Vous pouvez également auto-héberger le serveur relay via Docker.",
"FAQ_Q4": "Quels navigateurs et plateformes prennent en charge KoalaSync ?",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave et tous les navigateurs basés sur Chromium. Installez-le depuis le Chrome Web Store ou les modules complémentaires Firefox.",
"FAQ_Q5": "Tous mes amis doivent-ils installer l'extension ?",
"FAQ_A5": "Oui, chaque participant a besoin de KoalaSync mais sans inscription ni création de compte. Cliquez simplement sur le lien d'invitation, installez l'extension si nécessaire et vous rejoignez automatiquement le salon.",
"FAQ_A5": "Oui, chaque participant a besoin de KoalaSync, mais sans inscription ni création de compte. Cliquez simplement sur le lien d'invitation, installez l'extension si nécessaire et vous rejoignez automatiquement le salon.",
"FAQ_Q6": "Mes données sont-elles en sécurité ? Et si je ne fais pas confiance au serveur officiel ?",
"FAQ_A6": "Totalement sûr. Le serveur relay de KoalaSync fonctionne uniquement en RAM toutes les données de session sont supprimées dès que vous quittez le salon. Aucune base de données, aucun journal, aucune analyse, aucun compte. Si vous préférez un contrôle total : hébergez votre propre serveur relay privé via Docker en quelques minutes. Le code source est entièrement open source et vérifiable sur GitHub.",
"FAQ_A6": "Totalement sûr. Le serveur relay de KoalaSync fonctionne uniquement en RAM, toutes les données de session sont supprimées dès que vous quittez le salon. Aucune base de données, aucun journal, aucune analyse, aucun compte. Si vous préférez un contrôle total : hébergez votre propre serveur relay privé via Docker en quelques minutes. Le code source est entièrement open source et vérifiable sur GitHub.",
"FAQ_Q7": "Puis-je atténuer les dialogues discrets et les explosions fortes en regardant des vidéos dans le navigateur ?",
"FAQ_A7": "Oui. KoalaSync 2.2.0 inclut un compresseur audio intégré qui réduit l'écart entre les parties silencieuses et bruyantes de votre vidéo. Il fonctionne localement via l'API Web Audio aucune donnée audio ne quitte votre ordinateur. Ouvrez le popup, créez un salon, allez dans Paramètres → Audio Processing, activez le compresseur et choisissez un préréglage. Fonctionne sur Netflix, Prime Video, Disney+, YouTube et tout site vidéo HTML5.",
"FAQ_A7": "Oui. KoalaSync 2.2.0 inclut un compresseur audio intégré qui réduit l'écart entre les parties silencieuses et bruyantes de votre vidéo. Il fonctionne localement via l'API Web Audio, aucune donnée audio ne quitte votre ordinateur. Ouvrez le popup, créez un salon, allez dans Paramètres → Audio Processing, activez le compresseur et choisissez un préréglage. Fonctionne sur Netflix, Prime Video, Disney+, YouTube et tout site vidéo HTML5.",
"HOWTO_TITLE": "Comment synchroniser des vidéos avec des amis avec KoalaSync",
"HOWTO_DESC": "Regardez des vidéos en parfaite synchronisation avec vos amis sur YouTube, Netflix, Twitch et plus. Sans inscription, sans pistage.",
"HOWTO_STEP_1_NAME": "Installer l'extension",
@@ -157,7 +167,7 @@
"MOCK_12": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"14\" height=\"14\" aria-hidden=\"true\"><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"/></svg> Pause",
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SYNC",
"MOCK_14": "Dernière activité",
"MOCK_15": "En attente de 1 participant (KoalaPC)...",
"MOCK_15": "En attente de 1 participant (🐶 HappyDog)...",
"MOCK_16": "Passer & lire",
"MOCK_17": "Votre pseudo",
"MOCK_18": "Masquer les onglets inutiles",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync n'est pas affilié à Netflix, Disney+, Amazon, YouTube, Twitch ou toute autre plateforme de streaming. Toutes les marques déposées appartiennent à leurs détenteurs respectifs.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync - Alternatives et comparatifs",
"ALT_INDEX_META_DESC": "Explorez des comparatifs honnêtes et des guides détaillés entre KoalaSync et dautres extensions de watch party et solutions de streaming.",
"ALT_INDEX_HEADING": "Guides et comparatifs",
"ALT_INDEX_INTRO": "Comment KoalaSync se compare-t-il aux autres outils de watch party et solutions de streaming ? Lisez nos comparatifs honnêtes et techniques pour trouver la meilleure option pour vos soirées cinéma à distance.",
"ALT_INDEX_READ_COMPARISON": "Lire le comparatif →",
"ALT_INDEX_READ_GUIDE": "Lire le guide →",
"ALT_INDEX_FOOTER_LINK": "Guides et comparatifs",
"ALT_TELEPARTY_TITLE": "KoalaSync vs Teleparty : quel outil de visionnage en groupe choisir ?",
"ALT_TELEPARTY_META_DESC": "Une comparaison pratique entre KoalaSync et Teleparty pour le visionnage en groupe : chat intégré, compatibilité mobile, synchronisation vidéo via navigateur, serveurs multimédias auto-hébergés et nature open-source.",
"ALT_TELEPARTY_INTRO": "KoalaSync et Teleparty répondent tous deux au même problème agaçant : regarder quelque chose ensemble sans avoir à passer par le rituel du « 3, 2, 1, lecture ». Ils adoptent simplement des approches différentes.<br><br>Teleparty est la solution idéale si vous souhaitez un chat intégré ou si vous voulez regarder du contenu sur mobile. KoalaSync est davantage conçu pour le visionnage sur navigateur (PC/Mac) lorsque vous communiquez déjà via Discord, Teamspeak ou un autre service d'appel vocal, et que vous voulez simplement que la lecture reste synchronisée.<br><br>La raison principale pour laquelle j'ai créé KoalaSync est la flexibilité. L'outil est conçu pour fonctionner avec presque tous les sites web utilisant un lecteur vidéo standard, et non avec une liste fixe de plateformes. Cela inclut les installations auto-hébergées comme Emby, Jellyfin et Plex, les domaines locaux ou privés, ainsi que de nombreuses pages vidéo classiques sur navigateur.",
@@ -191,7 +208,7 @@
"ALT_TELEPARTY_LIMITS_TITLE": "Limites en toute transparence",
"ALT_TELEPARTY_LIMITS_BODY": "KoalaSync n'est pas magique et ne cherche pas à dissimuler ses limites. Actuellement, il ne fonctionne que sur les navigateurs de bureau. Il ne dispose ni de messagerie intégrée ni d'application mobile.<br><br>La compatibilité dépend également du navigateur et du lecteur vidéo. KoalaSync devrait fonctionner avec presque tous les lecteurs vidéo standard, mais les sites web peuvent modifier leurs lecteurs, la gestion des DRM ou les restrictions du navigateur à tout moment.<br><br>KoalaSync n'est affilié ni à Netflix, Disney+, Prime Video, YouTube, Teleparty, Emby, Jellyfin, Plex, ni à aucune autre marque mentionnée ici. Ces noms sont utilisés uniquement pour illustrer des cas d'utilisation courants.",
"ALT_TELEPARTY_SUMMARY_TITLE": "Résumé",
"ALT_TELEPARTY_SUMMARY_BODY": "Si vous recherchez une fonction de chat intégrée ou une prise en charge mobile, Teleparty pourrait être la meilleure option. Si vous préférez une solution gratuite et open source de synchronisation via navigateur (sur ordinateur) compatible avec presque tous les lecteurs vidéo classiques y compris les serveurs multimédias auto-hébergés comme Emby, Jellyfin et Plex, alors KoalaSync est probablement le choix idéal.",
"ALT_TELEPARTY_SUMMARY_BODY": "Si vous recherchez une fonction de chat intégrée ou une prise en charge mobile, Teleparty pourrait être la meilleure option. Si vous préférez une solution gratuite et open source de synchronisation via navigateur (sur ordinateur) compatible avec presque tous les lecteurs vidéo classiques, y compris les serveurs multimédias auto-hébergés comme Emby, Jellyfin et Plex, alors KoalaSync est probablement le choix idéal.",
"ALT_SCREEN_TITLE": "KoalaSync vs partage d'écran : quand la synchronisation vidéo est-elle préférable ?",
"ALT_SCREEN_META_DESC": "Une comparaison pratique entre KoalaSync et le partage d'écran pour les soirées cinéma à distance : contrôle de la lecture, qualité vidéo, confidentialité, sous-titres et visionnage via navigateur.",
"ALT_SCREEN_INTRO": "Le partage d'écran fonctionne et, honnêtement, cela suffit parfois. Une personne partage son écran, les autres regardent, et le tour est joué.<br><br>Cependant, pour des soirées cinéma plus longues ou pour regarder des épisodes ensemble, cela peut devenir contraignant. La qualité vidéo dépend de la vitesse d'envoi (upload), du processeur et du navigateur de la personne qui partage, ainsi que de la compression appliquée par Discord, Teamspeak, Zoom ou toute autre application d'appel. De plus, une seule personne contrôle réellement la lecture.",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSync ne remplace pas un appel vocal. Si vous souhaitez discuter tout en regardant, vous continuez à utiliser Discord, Teamspeak, Signal, WhatsApp ou tout autre outil habituel.<br><br>Chacun doit également pouvoir accéder à la vidéo ou à la page depuis son propre appareil. KoalaSync ne contourne ni les abonnements, ni les identifiants, ni les DRM, ni les restrictions géographiques ou les règles des plateformes.<br><br>L'outil fonctionne actuellement uniquement sur les navigateurs de bureau, ne dispose pas de fonction de chat ou de voix intégrée, et la compatibilité dépend toujours du navigateur et du lecteur vidéo utilisé.",
"ALT_SCREEN_SUMMARY_TITLE": "Résumé",
"ALT_SCREEN_SUMMARY_BODY": "Le partage d'écran est la solution la plus simple si vous cherchez une méthode rapide sans accorder une grande importance à la qualité, à la confidentialité ou au contrôle individuel. KoalaSync est plus adapté lorsque chaque participant doit visionner le contenu localement dans son propre navigateur, pour une expérience se rapprochant davantage d'un véritable visionnage en commun.",
"ALT_TRY_KOALASYNC": "Essayer KoalaSync"
"ALT_W2G_TITLE": "KoalaSync vs Watch2Gether : quelle solution de watch party vous convient le mieux ?",
"ALT_W2G_META_DESC": "Une comparaison honnête entre KoalaSync et Watch2Gether. Découvrez quand la flexibilité de KoalaSync est imbattable et pourquoi Watch2Gether reste le premier choix pour YouTube.",
"ALT_W2G_INTRO": "KoalaSync et Watch2Gether résolvent tous deux le même problème : regarder des vidéos synchronisées avec des amis en ligne sans coordination manuelle. Alors que Watch2Gether est l'un des hubs les plus anciens et les plus populaires pour les soirées cinéma partagées, KoalaSync adopte une approche légère et complètement différente. Le choix de l'outil qui vous convient dépend fortement de ce que vous souhaitez regarder et de l'endroit où vous le souhaitez.",
"ALT_W2G_WHEN_W2G_TITLE": "Quand Watch2Gether est le meilleur choix",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether est imbattable pour les <strong>soirées de visionnage sur YouTube</strong>. Grâce à sa liste de lecture et à sa recherche intégrées, n'importe qui dans la pièce peut facilement trouver, ajouter et lire de nouvelles vidéos. Tout le monde regarde la vidéo suivante ensemble de manière transparente.<br><br>Avec KoalaSync sur YouTube, la lecture automatique par défaut du site prend le relais, redirigeant chaque utilisateur vers une vidéo recommandée différente. Notre fonctionnalité automatique de prochain épisode (« Episode Lobby »), qui fonctionne très bien sur Netflix ou Disney+, ne fonctionne pas sur YouTube en raison de ces recommandations dynamiques. Pour les pures soirées YouTube, Watch2Gether est le meilleur choix.",
"ALT_W2G_WHEN_KOALA_TITLE": "Quand KoalaSync s'adapte mieux",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync brille sur les <strong>vrais services de streaming</strong> (Netflix, Prime Video, Disney+) et les serveurs multimédias auto-hébergés (Jellyfin, Plex, Emby). Contrairement à Watch2Gether, qui ne peut souvent pas lire du contenu premium, KoalaSync synchronise le lecteur natif directement sur le site Web.<br><br>Il fonctionne sur presque tous les sites dotés d'un lecteur vidéo HTML5 standard. Vous n'avez pas besoin de créer une salle virtuelle sur un site tiers : activez simplement l'extension, rejoignez un lobby et commencez à regarder.",
"ALT_W2G_MAIN_DIFF_TITLE": "La principale différence",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether est un <strong>site Web autonome</strong> avec chat, listes de lecture et prise en charge par webcam intégrés. KoalaSync est une <strong>extension de navigateur minimaliste</strong> qui se connecte directement aux onglets normaux de votre navigateur.<br><br>Vous recherchez un package tout-en-un pour YouTube avec chat intégré ? Utilisez Watch2Gether. Vous souhaitez regarder des films sur Netflix ou sur votre propre serveur sans distractions, en qualité native (pas de compression du serveur) ? KoalaSync est la solution la plus propre.",
"ALT_W2G_LIMITS_TITLE": "Limites honnêtes",
"ALT_W2G_LIMITS_BODY": "KoalaSync <strong>n'a pas de listes de lecture intégrées ni de recherche de vidéos</strong>. Sur YouTube, cela signifie que la lecture automatique de la vidéo suivante ne restera pas synchronisée.<br><br>De plus, il n'y a <strong>pas de chat intégré</strong> et KoalaSync ne fonctionne actuellement que sur les navigateurs de bureau. Il est conçu en supposant que vous parlez déjà via Discord, Teamspeak ou d'autres outils vocaux de toute façon.",
"ALT_W2G_SUMMARY_TITLE": "En bref",
"ALT_W2G_SUMMARY_BODY": "Pour les sessions YouTube spontanées avec listes de lecture et chat intégré, Watch2Gether est le meilleur choix. Pour les plateformes de streaming premium (comme Netflix, Prime Video, Disney+), les serveurs auto-hébergés (Jellyfin, Plex, Emby) et une flexibilité maximale du navigateur, KoalaSync est l'outil le plus adapté et le plus léger.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener : quelle plateforme de watch party convient le mieux ?",
"ALT_SCENER_META_DESC": "Une comparaison honnête de KoalaSync et Scener. Découvrez quand le chat par webcam de Scener l'emporte et pourquoi KoalaSync est le meilleur pour des soirées cinéma sans distraction.",
"ALT_SCENER_INTRO": "KoalaSync et Scener abordent les soirées de visionnage sous deux angles complètement différents. Scener est une salle de cinéma virtuelle avec chat vidéo intégré et salles interactives. KoalaSync, quant à lui, est une extension de navigateur minimaliste et respectueuse de la vie privée qui synchronise simplement les commandes de lecture. Loutil qui vous convient le mieux dépend principalement de limportance pour vous des fonctionnalités de webcam et de chat intégrées.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Quand Scener est le meilleur choix",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener est un choix judicieux si vous souhaitez une <strong>plateforme sociale tout-en-un</strong> avec chat vidéo et audio intégré directement dans votre navigateur. Scener crée une salle virtuelle où les webcams du joueur et de vos amis sont affichées côte à côte. Cest idéal pour les grandes soirées publiques ou les événements virtuels en streaming où laspect social est au premier plan. Cependant, gardez à l'esprit que la version de base gratuite est financée par la publicité et que Scener verrouille de nombreuses fonctionnalités (telles que la visualisation sans publicité et le chat vidéo illimité) derrière un abonnement mensuel (5,79 $/mois ou 39,99 $/an).",
"ALT_SCENER_WHEN_KOALA_TITLE": "Quand KoalaSync s'adapte mieux",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync brille en matière de <strong>qualité vidéo, confidentialité et simplicité</strong> :<br><br>• <strong>Aucun compte</strong> : vous n'avez pas besoin de vous inscrire, de vous connecter ou de gérer des profils. Activez simplement l'extension, partagez un code de salle et commencez à regarder.<br>• <strong>Véritable qualité native (4K/HDR)</strong> : Scener diffuse des vidéos compressées à partir d'un serveur cloud virtuel, ce qui peut entraîner une perte de qualité et un retard. KoalaSync synchronise le lecteur natif directement sur votre ordinateur, ce qui signifie que vous regardez des films dans la pleine résolution de votre abonnement de streaming.<br>• <strong>Faible utilisation de la bande passante</strong> : étant donné que seules les données de contrôle (lecture, pause, horodatage) sont transmises, KoalaSync n'utilise pratiquement aucune bande passante supplémentaire. Scener diffuse l'intégralité des flux vidéo et des caméras sur des serveurs cloud, ce qui peut mettre à rude épreuve les connexions Internet plus lentes et les ordinateurs portables plus anciens.<br>• <strong>100 % gratuit et sans publicité</strong> : pas de frais d'abonnement mensuels, pas de publicité et pas de trackers.<br>• <strong>Fichiers vidéo locaux</strong> : étant donné que KoalaSync fonctionne localement, vous pouvez même regarder vos propres fichiers vidéo (comme MP4) en synchronisation avec vos amis. Faites simplement glisser et déposez le fichier dans un onglet du navigateur Scener ne peut pas le faire car son lecteur fonctionne dans le cloud.",
"ALT_SCENER_MAIN_DIFF_TITLE": "La principale différence",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener est un <strong>réseau social commercial</strong> pour les soirées de visionnage, alimenté par des navigateurs cloud virtuels et financé par des publicités et des abonnements mensuels. KoalaSync est un <strong>utilitaire de synchronisation gratuit et axé sur la confidentialité</strong> qui se connecte directement aux onglets de votre navigateur. Il laisse le chat vocal/vidéo à des applications comme Discord ou Teamspeak, se concentrant entièrement sur le maintien de votre lecture fluide, privée et dans sa qualité d'origine native.",
"ALT_SCENER_LIMITS_TITLE": "Limites honnêtes",
"ALT_SCENER_LIMITS_BODY": "KoalaSync n'offre <strong>pas de support intégré pour le chat ou la webcam</strong>. Il s'agit uniquement d'un outil de synchronisation et nécessite un outil d'appel vocal distinct de votre choix. De plus, KoalaSync est actuellement uniquement disponible sur ordinateur et la compatibilité des fichiers vidéo locaux dépend entièrement de la prise en charge native par votre navigateur de la lecture du format vidéo et des codecs audio.",
"ALT_SCENER_SUMMARY_TITLE": "En bref",
"ALT_SCENER_SUMMARY_BODY": "Pour les grandes soirées de visionnage avec chat par webcam intégré et fonctionnalités sociales, Scener est le bon choix, à condition que les publicités et les paywalls premium ne vous dérangent pas. Si vous souhaitez une expérience entièrement gratuite, sans publicité et sans distraction dans le lecteur natif (y compris Netflix, Prime Video, Disney+ ou les fichiers du navigateur local) et que vous êtes déjà en appel vocal, KoalaSync est la solution la plus propre et la plus performante.",
"ALT_KOSMI_TITLE": "KoalaSync vs Kosmi : Quelle alternative de fête Netflix vous convient le mieux ?",
"ALT_KOSMI_META_DESC": "Une comparaison honnête de KoalaSync et Kosmi. Découvrez pourquoi la configuration sans extension de Kosmi est pratique et quand la qualité vidéo native de KoalaSync l'emporte.",
"ALT_KOSMI_INTRO": "KoalaSync et Kosmi offrent tous deux d'excellents moyens de regarder Netflix, YouTube et d'autres plateformes en synchronisation avec des amis. Cependant, leurs technologies sous-jacentes sont fondamentalement différentes. Kosmi utilise des navigateurs cloud virtuels qui s'exécutent directement dans votre navigateur Web sans installer d'extensions. KoalaSync est une extension légère qui synchronise votre lecteur vidéo local. L'approche qui vous convient le mieux dépend de vos priorités en matière de qualité vidéo, de commodité et de confidentialité.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Quand Kosmi est le meilleur choix",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi est imbattable si vous voulez <strong>éviter d'installer quoi que ce soit</strong> ou si vous souhaitez regarder sur des appareils comme les tablettes et les smartphones. Étant donné que Kosmi exécute des navigateurs virtuels dans le cloud, il suffit pour s'inscrire d'un simple lien Web. De plus, Kosmi est une plate-forme de rencontre tout-en-un : en plus du streaming synchronisé, vous pouvez jouer à des jeux multijoueurs (comme les classiques rétro NES/SNES ou le poker) et utiliser la webcam, le chat vocal et textuel intégrés. Si vous souhaitez organiser une soirée de jeux sociaux et regarder une soirée sans configuration, Kosmi est une solution fantastique.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "Quand KoalaSync s'adapte mieux",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync brille en matière de <strong>qualité de lecture native, sécurité et performances</strong> :<br><br>• <strong>Aucun risque de sécurité</strong> : avec Kosmi, vous devez vous connecter à votre compte Netflix ou Prime sur un ordinateur virtuel distant dans le cloud. Avec KoalaSync, vous vous connectez en toute sécurité sur le site officiel de streaming dans votre propre navigateur, comme vous le faites habituellement. Vos mots de passe ne quittent jamais votre ordinateur.<br>• <strong>Qualité vidéo complète (4K/HDR)</strong> : Kosmi diffuse l'écran du navigateur virtuel sous forme de flux vidéo compressé, ce qui peut entraîner une pixellisation et une mise en mémoire tampon. KoalaSync synchronise les lecteurs natifs localement : vous profitez de films dans la résolution complète et cristalline de votre abonnement.<br>• <strong>Sans décalage et respectueux de la bande passante</strong> : étant donné que KoalaSync envoie uniquement des commandes de contrôle (lecture/pause/horodatage), il n'utilise presque aucune bande passante. Kosmi diffuse constamment des flux vidéo HD, ce qui peut surcharger les connexions plus lentes.<br>• <strong>Fichiers vidéo locaux</strong> : si vous souhaitez regarder une vidéo privée, faites simplement glisser et déposez le fichier MP4 dans un onglet du navigateur et synchronisez-le. Kosmi ne peut pas accéder aux fichiers sur votre disque dur local.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "La principale différence",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi est un <strong>hangout virtuel dans le cloud</strong> qui diffuse l'écran d'un navigateur distant afin que personne n'ait besoin d'installer une extension. KoalaSync est une <strong>couche de synchronisation du navigateur local</strong> qui se connecte directement au lecteur natif sur le site officiel de streaming. Alors que Kosmi est plus polyvalent pour les mini-jeux et la compatibilité des appareils, KoalaSync offre une expérience de streaming plus sécurisée, fluide et plus précise dans le lecteur d'origine.",
"ALT_KOSMI_LIMITS_TITLE": "Limites honnêtes",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync <strong>nécessite l'installation d'une extension de navigateur</strong> et ne fonctionne actuellement que sur les ordinateurs de bureau. Il <strong>n'a pas de chat ni de webcams intégrés</strong>, car il est conçu en supposant que vous parlez déjà via Discord ou d'autres outils vocaux de toute façon. Il ne propose pas non plus de jeux intégrés.",
"ALT_KOSMI_SUMMARY_TITLE": "En bref",
"ALT_KOSMI_SUMMARY_BODY": "Pour des soirées de jeux décontractées avec des classiques rétro et un accès facile sur les appareils mobiles sans aucune installation, Kosmi est idéal. Pour les soirées cinéma premium sur Netflix, Prime Video, Disney+ ou Plex en qualité 4K complète, avec une sécurité maximale et un impact minimal sur la bande passante, KoalaSync est clairement le gagnant.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven : quelle solution de soirée de surveillance convient le mieux ?",
"ALT_TWOSEVEN_META_DESC": "Une comparaison honnête de KoalaSync et TwoSeven. Découvrez quand la webcam intégrée de TwoSeven gagne et pourquoi KoalaSync est le meilleur pour Disney+ et Netflix.",
"ALT_TWOSEVEN_INTRO": "KoalaSync et TwoSeven utilisent la même approche de base pour les séances de visionnage : ils synchronisent le lecteur vidéo d'origine directement dans votre navigateur, plutôt que de diffuser un flux vidéo compressé depuis le cloud. Cela garantit une qualité vidéo de premier ordre pour les deux outils. Cependant, même si TwoSeven est un portail commercial avec chat par webcam et niveaux d'abonnement intégrés, KoalaSync reste une extension minimaliste, entièrement gratuite et respectueuse de la vie privée. Découvrez ici quel service vous convient le mieux.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "Quand TwoSeven est le meilleur choix",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven est le bon choix si vous souhaitez une <strong>solution tout-en-un avec webcam et chat audio intégrés</strong> directement dans votre navigateur. Si vous souhaitez voir vos amis tout en regardant sans avoir à exécuter Discord ou Teamspeak en arrière-plan, TwoSeven propose cette intégration de manière native. De plus, il fonctionne pour YouTube et quelques lecteurs vidéo Web ouverts sans extensions. Il convient bien aux petits groupes de 2 à 3 personnes qui souhaitent partager une connexion visuelle tout en visionnant.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "Quand KoalaSync s'adapte mieux",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync brille par son <strong>absence totale de frais, de confidentialité et de simplicité</strong> :<br><br>• <strong>Aucun paywall</strong> : pour regarder des services premium comme Disney+ ou Hulu en synchronisation sur TwoSeven, au moins un membre de la salle doit les soutenir sur Patreon (à partir de 3 $/mois). KoalaSync synchronise Netflix, Prime Video, Disney+ et les serveurs multimédias auto-hébergés (Jellyfin, Plex, Emby) de manière 100 % gratuite et sans aucune restriction.<br>• <strong>Confidentialité absolue (pas de trackers/publicités)</strong> : TwoSeven est financé par la publicité et utilise plusieurs trackers de Google, Facebook et autres. KoalaSync n'a pas de publicité, pas de tracker et communique exclusivement avec le serveur relais RAM uniquement.<br>• <strong>Aucune inscription requise</strong> : TwoSeven demande à tous les participants de créer un compte et de se connecter. KoalaSync est totalement sans compte. Il vous suffit de l'installer, de saisir un code de pièce et de commencer à regarder.<br>• <strong>Léger et respectueux des ressources</strong> : la webcam et les flux audio intégrés de TwoSeven imposent une lourde charge sur votre processeur et votre réseau. En laissant la communication à des outils comme Discord, KoalaSync fonctionne de manière extrêmement fluide et préserve la durée de vie de la batterie.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "La principale différence",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven est une <strong>plate-forme commerciale</strong> avec des conditions d'inscription, des publicités, des discussions par webcam peer-to-peer et des paywalls Patreon pour des services de streaming spécifiques. KoalaSync est un <strong>utilitaire open source gratuit</strong> qui se connecte directement aux onglets de votre navigateur sans compte, tracker ou frais supplémentaires, permettant un visionnage sans distraction dans le lecteur natif.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Limites honnêtes",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync n'offre <strong>pas de webcam ni de chat audio intégré</strong> et suppose que vous êtes déjà en communication via Discord ou un outil similaire. De plus, KoalaSync n'a pas de superposition de boîte de discussion intégrée et est actuellement uniquement disponible sur ordinateur.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "En bref",
"ALT_TWOSEVEN_SUMMARY_BODY": "Pour les petits groupes de deux ou trois personnes qui souhaitent se voir via des webcams directement dans le navigateur et qui ne craignent pas de prendre en charge le support Patreon pour Disney+, TwoSeven est une option intéressante. Pour des soirées cinéma sans publicité, entièrement gratuites et privées en qualité 4K native (que ce soit Netflix, Prime Video, Disney+ ou Jellyfin) sans inscription, KoalaSync est le choix le plus propre et le plus sûr.",
"ALT_TRY_KOALASYNC": "Essayer KoalaSync",
"MOCK_HOST_CONTROL_LABEL": "Contrôle de l'hôte",
"MOCK_HOST_CONTROL_TOGGLE": "Seul moi peut contrôler la lecture",
"LABEL_SELECT_VIDEO": "Choisir une vidéo",
"OPTION_SELECT_TAB": "-- Choisir un onglet --",
"THEME_TOGGLE_LABEL": "Basculer mode clair/sombre",
"FAQ_SHOW_ALL": "Afficher toutes les questions",
"FAQ_HIDE_ALL": "Masquer les questions",
"SELF_SHOW_SETUP": "Afficher le guide d'installation",
"SELF_HIDE_SETUP": "Masquer le guide d'installation",
"HERO_TRUST": "Gratuit · Open source · Sans compte",
"COMP_MORE_GUIDES": "Comparatif complet et autres alternatives"
}
+107 -27
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "it_IT",
"META_TITLE": "KoalaSync | Sincronizza Netflix, YouTube e qualsiasi video con i tuoi amici",
"META_DESCRIPTION": "Guarda Netflix, YouTube, Twitch e qualsiasi video HTML5 in perfetta sincronia. Estensione gratuita, open source e senza registrazione.",
"SCHEMA_APP_DESC": "Guarda Netflix, YouTube, Twitch e qualsiasi video HTML5 in perfetta sincronia. Estensione gratuita, open source e senza registrazione.",
"OG_TITLE": "KoalaSync | Sincronizza Netflix, Emby, Jellyfin e video web con i tuoi amici",
"OG_DESCRIPTION": "Guarda video in perfetta sincronia con i tuoi amici. Estensione open source per Chrome e Firefox incentrata sulla privacy.",
"TWITTER_TITLE": "KoalaSync | Sincronizza video in streaming con i tuoi amici",
"TWITTER_DESCRIPTION": "Guarda video insieme ai tuoi amici in perfetta sincronia. Open source e rispettoso della privacy.",
"META_TITLE": "KoalaSync | Watch party per Netflix, YouTube e ogni video",
"META_DESCRIPTION": "Watch party su Netflix, YouTube, Twitch e qualsiasi video HTML5. Estensione gratuita e open source per Chrome e Firefox. Senza account, tracking né pubblicità.",
"SCHEMA_APP_DESC": "Watch party su Netflix, YouTube, Twitch e qualsiasi video HTML5. Estensione gratuita e open source per Chrome e Firefox. Senza account, tracking né pubblicità.",
"OG_TITLE": "KoalaSync | Watch party per Netflix, Emby, Jellyfin e quasi ogni video",
"OG_DESCRIPTION": "Avvia una watch party su Netflix, Emby, Jellyfin, YouTube, Twitch e quasi ogni video HTML5. Open source, privata e senza account.",
"TWITTER_TITLE": "KoalaSync | Watch party per Netflix, Emby, Jellyfin e quasi ogni video Estensione",
"TWITTER_DESCRIPTION": "Avvia una watch party su Netflix, Emby, Jellyfin, YouTube, Twitch e quasi ogni video HTML5. Open source, privata e senza account.",
"NAV_FEATURES": "Funzionalità",
"NAV_HOW_IT_WORKS": "Come Funziona",
"HERO_TITLE": "Guardate Insieme.<span class='hero-line2'>Sincronia Perfetta.</span>",
"HERO_SUBTITLE": "La tua serata cinema a distanza senza ritardi. Nessun account, nessun dato raccolto. Condividi un link e guardate insieme.",
"HERO_TITLE": "Trasforma qualsiasi video in una <span class='hero-highlight'>watch party</span>.",
"HERO_SUBTITLE": "La tua serata film a distanza, senza lag. Niente account, niente tracciamento, niente pubblicità. Condividi un link e premete play insieme.",
"HERO_MASCOT_ALT": "Un simpatico koala che guarda i pulsanti di download",
"DEMO_SYNC": "Sincronizzato",
"DEMO_HINT": "Demo dal vivo: premi play in una delle schede e KoalaSync le mantiene sincronizzate.",
"DEMO_NO_ROOM": "Non ancora connesso",
"DEMO_CREATE_ROOM": "Crea stanza",
"DEMO_JOINED": "Entrato nella stanza",
"DEMO_TAB_SELECTED": "Scheda selezionata",
"DEMO_SELECT_PLACEHOLDER": "Scegli una scheda video…",
"MOBILE_DEMO_CTA": "Guarda come funziona",
"MOBILE_DEMO_TITLE": "Demo live di KoalaSync",
"MOBILE_DEMO_CLOSE": "Chiudi demo",
"ADD_TO_CHROME": "Aggiungi a Chrome",
"ADD_TO_FIREFOX": "Aggiungi a Firefox",
"COMPAT_HEADING": "Compatibile con le tue piattaforme preferite",
@@ -35,20 +45,20 @@
"USE_CASE_3_DESC": "Accorcia le distanze e goditi serate romantiche. Vivi ogni emozione e ridi alle stesse battute nello stesso identico istante.",
"WHY_TITLE": "Perché KoalaSync?",
"WHY_SUBTITLE": "Sincronizzazione affidabile, massima privacy e configurazione immediata.",
"FEATURE_1_TITLE": "Controllo Totale / Sincro Istantanea",
"FEATURE_1_DESC": "Se uno mette in pausa, tutti si fermano. Se uno salta in avanti, gli altri lo seguono. Tutto in tempo reale.",
"FEATURE_1_TITLE": "Controllo dell'host e sincronizzazione",
"FEATURE_1_DESC": "Decidi tu chi controlla la riproduzione. Attiva il controllo host per consentire solo a te di mettere in pausa e avanzare, o nomina co-host.",
"FEATURE_2_TITLE": "Maratone senza interruzioni",
"FEATURE_2_DESC": "Riproduzione automatica sincronizzata. KoalaSync attende che tutti abbiano caricato l'episodio successivo prima di farlo partire.",
"FEATURE_3_TITLE": "Senza Account / Privacy Totale",
"FEATURE_3_DESC": "Niente registrazioni o tracciamenti. Il server non salva nulla e cancella la tua stanza appena te ne vai.",
"FEATURE_4_TITLE": "Supporto HTML5 Universale",
"FEATURE_4_DESC": "Funziona su YouTube, Twitch, Netflix, Jellyfin, Emby e quasi ogni pagina web. Nessun dato video viene inviato ai nostri server.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby e quasi ogni pagina con video HTML5. Escono solo i segnali di sync, mai il video.",
"FEATURE_5_TITLE": "Ospitabile in Proprio (Docker)",
"FEATURE_5_DESC": "I nostri server sono veloci, ma puoi gestire il tuo server privato in pochi secondi tramite Docker.",
"FEATURE_6_TITLE": "Inviti Rapidi / Un clic per entrare",
"FEATURE_6_DESC": "Niente password complicate. Condividi il link generato e i tuoi amici entreranno automaticamente con un solo clic.",
"FEATURE_7_TITLE": "Volume Bilanciato / Compressore Audio",
"FEATURE_7_DESC": "Basta regolare il volume ogni minuto. Il compressore integrato esalta le voci e attenua i rumori forti. Tutto in locale.",
"FEATURE_7_DESC": "Basta armeggiare col volume. Un compressore integrato alza i dialoghi sommessi e attenua le esplosioni forti, tutto elaborato localmente nel browser.",
"FEATURE_8_TITLE": "Open Source (Licenza MIT)",
"FEATURE_8_DESC": "Tutto il codice è pubblico su GitHub. Trasparenza totale, senza scatole nere o software proprietario.",
"COMP_TITLE": "KoalaSync vs Teleparty",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Politiche sulla privacy di Teleparty:",
"COMP_FOOTNOTE_4": "Funziona su siti che permettono l'uso di script nei tag video HTML5. Alcuni siti con protezioni DRM molto rigide potrebbero limitare il controllo automatico.",
"STEPS_TITLE": "Inizia ora",
"STEP_1_TITLE": "Installa l'Estensione",
"STEP_1_DESC": "Aggiungi KoalaSync al tuo browser dal Chrome Web Store o dai componenti aggiuntivi di Firefox.",
"STEP_1_ILLUS_DESC": "Sincronizzatore video privato",
"STEP_1_ILLUS_DL_CHROME": "Scarica per Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Scarica per Firefox",
"STEP_1_ILLUS_ACTIVE": "Estensione Attiva",
"STEP_1_ILLUS_READY": "Pronti a guardare!",
"STEP_2_TITLE": "Crea una Stanza",
"STEP_2_DESC": "Apri l'estensione e clicca su '+ Crea Nuova Stanza'. Verrà generato un link di invito automaticamente.",
"STEP_1_TITLE": "Creare e condividere la stanza",
"STEP_1_DESC": "Apri l'estensione, crea una stanza con un clic e condividi il link con i tuoi amici. Si uniranno all'istante tramite il link di invito.",
"STEP_1_ILLUS_DESC": "Scegli una scheda da collegare",
"STEP_1_ILLUS_DL_CHROME": "Collega scheda YouTube",
"STEP_1_ILLUS_DL_FIREFOX": "Collega scheda Netflix",
"STEP_1_ILLUS_ACTIVE": "Scheda collegata",
"STEP_1_ILLUS_READY": "Pronto per guardare in sincro !",
"STEP_2_TITLE": "Selezionare la scheda del video",
"STEP_2_DESC": "Vai alla scheda del tuo video e selezionala nel menu dell'estensione. KoalaSync collegherà i vostri lettori in modo automatico.",
"STEP_2_ILLUS_ROOM": "Stanza",
"STEP_2_ILLUS_SYNC": "Sincro",
"STEP_2_ILLUS_SETTINGS": "Ajustes",
"STEP_2_ILLUS_CREATE": "+ Crea Nuova Stanza",
"STEP_2_ILLUS_MANUAL": "Manuale / Avanzato",
"STEP_2_ILLUS_COPIED": "Link copiato!",
"STEP_3_TITLE": "Condividi e Guarda",
"STEP_3_DESC": "Invia il link ai tuoi amici. Una volta connessi, scegli il video e goditi la riproduzione sincronizzata.",
"STEP_3_TITLE": "Godersi la sincronizzazione",
"STEP_3_DESC": "Avvia la riproduzione. Quando qualcuno mette in pausa, avanza o riproduce, il video di tutti rimarrà sincronizzato in tempo reale senza ritardi.",
"STEP_3_ILLUS_IN_SYNC": "SINCRONIZZATI",
"SELF_TITLE": "Per utenti esperti",
"SELF_SUBTITLE": "Preferisci gestire i tuoi dati? Avvia il tuo server privato in pochi minuti.",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SYNC",
"MOCK_14": "Vai dagli altri",
"MOCK_15": "Ultima attività",
"MOCK_16": "In attesa di un amico (KoalaPC)...",
"MOCK_16": "In attesa di un amico (🐶 HappyDog)...",
"MOCK_17": "Salta l'attesa",
"MOCK_18": "Tuo Nome",
"MOCK_19": "Nascondi schede",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync non è affiliato a Netflix, YouTube o altre piattaforme. I marchi appartengono ai rispettivi proprietari.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync - Alternative e confronti",
"ALT_INDEX_META_DESC": "Scopri confronti onesti e guide dettagliate tra KoalaSync e altre estensioni per watch party e soluzioni di streaming.",
"ALT_INDEX_HEADING": "Guide e confronti",
"ALT_INDEX_INTRO": "Come si confronta KoalaSync con altri strumenti per watch party e soluzioni di streaming? Leggi i nostri confronti onesti e tecnici per trovare lopzione migliore per le tue serate film a distanza.",
"ALT_INDEX_READ_COMPARISON": "Leggi il confronto →",
"ALT_INDEX_READ_GUIDE": "Leggi la guida →",
"ALT_INDEX_FOOTER_LINK": "Guide e confronti",
"ALT_TELEPARTY_TITLE": "KoalaSync vs Teleparty: quale strumento scegliere per le watch party?",
"ALT_TELEPARTY_META_DESC": "Un confronto pratico tra KoalaSync e Teleparty per le watch party: chat integrata, supporto mobile, sincronizzazione video nel browser, server multimediali self-hosted e natura open-source.",
"ALT_TELEPARTY_INTRO": "Sia KoalaSync che Teleparty risolvono lo stesso fastidioso problema: guardare qualcosa insieme senza dover ricorrere alla classica procedura del '3, 2, 1, via'. Semplicemente, adottano approcci diversi.<br><br>Teleparty è la scelta ideale se cerchi una chat integrata o se vuoi guardare i contenuti da dispositivo mobile. KoalaSync è più indicato per le watch party su browser desktop, quando stai già comunicando tramite Discord, Teamspeak o un'altra chiamata vocale e vuoi semplicemente mantenere sincronizzata la riproduzione.<br><br>Il motivo principale per cui ho creato KoalaSync è la flessibilità. È progettato per funzionare con quasi tutti i siti web che utilizzano un normale lettore video del browser, non solo con una lista predefinita di piattaforme. Ciò include configurazioni self-hosted come Emby, Jellyfin e Plex, domini locali o privati e molte pagine web che ospitano video.",
@@ -191,7 +208,7 @@
"ALT_TELEPARTY_LIMITS_TITLE": "Limiti dichiarati apertamente",
"ALT_TELEPARTY_LIMITS_BODY": "KoalaSync non fa miracoli e non cerca di nascondere i propri limiti. Attualmente funziona solo su browser desktop; non dispone di chat integrata né di un'app per dispositivi mobili.<br><br>La compatibilità dipende anche dal browser e dal lettore video utilizzato. KoalaSync dovrebbe funzionare con quasi tutti i normali lettori video dei browser, ma i siti web possono modificare in qualsiasi momento i propri lettori, la gestione dei DRM o le restrizioni del browser.<br><br>KoalaSync non è affiliato a Netflix, Disney+, Prime Video, YouTube, Teleparty, Emby, Jellyfin, Plex o qualsiasi altro marchio qui menzionato. I nomi sono utilizzati esclusivamente per illustrare i tipici scenari di utilizzo.",
"ALT_TELEPARTY_SUMMARY_TITLE": "Riepilogo",
"ALT_TELEPARTY_SUMMARY_BODY": "Se cerchi una chat integrata o il supporto per dispositivi mobili, Teleparty potrebbe essere la scelta più adatta. Se invece preferisci una soluzione gratuita e open-source per la sincronizzazione tra browser desktop, compatibile con quasi tutti i comuni lettori video inclusi i media server self-hosted come Emby, Jellyfin e Plex KoalaSync è probabilmente l'opzione migliore.",
"ALT_TELEPARTY_SUMMARY_BODY": "Se cerchi una chat integrata o il supporto per dispositivi mobili, Teleparty potrebbe essere la scelta più adatta. Se invece preferisci una soluzione gratuita e open-source per la sincronizzazione tra browser desktop, compatibile con quasi tutti i comuni lettori video, inclusi i media server self-hosted come Emby, Jellyfin e Plex. KoalaSync è probabilmente l'opzione migliore.",
"ALT_SCREEN_TITLE": "KoalaSync vs condivisione schermo: quando è meglio la sincronizzazione video?",
"ALT_SCREEN_META_DESC": "Un confronto pratico tra KoalaSync e la condivisione dello schermo per serate film a distanza, analizzando controllo della riproduzione, qualità video, privacy, sottotitoli e visione tramite browser.",
"ALT_SCREEN_INTRO": "La condivisione dello schermo funziona e, a dire il vero, a volte è sufficiente. Una persona condivide il proprio schermo, le altre guardano e il gioco è fatto.<br><br>Tuttavia, per serate film più lunghe o per guardare insieme degli episodi, può diventare scomoda. La qualità video dipende dalla velocità di upload, dalla CPU e dal browser di chi condivide, oltre che dalla compressione applicata da app come Discord, Teamspeak, Zoom o altre piattaforme di chiamata. Inoltre, solo una persona ha il controllo effettivo della riproduzione.",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSync non sostituisce una chiamata vocale. Se volete parlare mentre guardate il contenuto, potete continuare a usare Discord, Teamspeak, Signal, WhatsApp o qualsiasi altro strumento abituale.<br><br>Ciascun partecipante deve inoltre poter accedere al video o alla pagina dal proprio dispositivo. KoalaSync non aggira abbonamenti, accessi, DRM, restrizioni geografiche o regole delle piattaforme.<br><br>Al momento è utilizzabile solo tramite browser desktop, non dispone di funzioni di chat o voce integrate e la compatibilità dipende sempre dal browser e dal lettore video.",
"ALT_SCREEN_SUMMARY_TITLE": "Riepilogo",
"ALT_SCREEN_SUMMARY_BODY": "La condivisione dello schermo è l'opzione più semplice quando si cerca una soluzione rapida e non si dà molta importanza alla qualità, alla privacy o al controllo individuale. KoalaSync è la scelta ideale quando tutti devono guardare il contenuto localmente sul proprio browser, offrendo un'esperienza che ricorda più da vicino la visione condivisa reale.",
"ALT_TRY_KOALASYNC": "Prova KoalaSync"
"ALT_W2G_TITLE": "KoalaSync vs Watch2Gether: quale soluzione per watch party è più adatta?",
"ALT_W2G_META_DESC": "Un confronto onesto tra KoalaSync e Watch2Gether. Scopri quando la flessibilità di KoalaSync è imbattibile e perché Watch2Gether è ancora la scelta migliore per YouTube.",
"ALT_W2G_INTRO": "KoalaSync e Watch2Gether risolvono entrambi lo stesso problema: guardare video sincronizzati con gli amici online senza coordinarsi manualmente. Mentre Watch2Gether è uno degli hub più antichi e popolari per le serate di cinema condivise, KoalaSync adotta un approccio completamente diverso e leggero. Lo strumento giusto per te dipende in larga misura da cosa e dove vuoi guardare.",
"ALT_W2G_WHEN_W2G_TITLE": "Quando Watch2Gether è la scelta migliore",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether è imbattibile per i <strong>watch party di YouTube</strong>. Grazie alla playlist e alla ricerca integrate, chiunque nella stanza può trovare, aggiungere e riprodurre facilmente nuovi video. Tutti guardano insieme il video successivo senza interruzioni.<br><br>Con KoalaSync su YouTube, la riproduzione automatica predefinita del sito prende il sopravvento, reindirizzando ogni utente a un video consigliato diverso. La nostra funzione automatica per l'episodio successivo (\"Lobby episodi\"), che funziona perfettamente su Netflix o Disney+, non funziona su YouTube a causa di questi consigli dinamici. Per le serate puramente YouTube, Watch2Gether è la scelta migliore.",
"ALT_W2G_WHEN_KOALA_TITLE": "Quando KoalaSync si adatta meglio",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync eccelle sui <strong>servizi di streaming reali</strong> (Netflix, Prime Video, Disney+) e sui server multimediali self-hosted (Jellyfin, Plex, Emby). A differenza di Watch2Gether, che spesso non può riprodurre affatto contenuti premium, KoalaSync sincronizza il lettore nativo direttamente sul sito web.<br><br>Funziona su quasi tutti i siti con un lettore video HTML5 standard. Non è necessario configurare una stanza virtuale su un sito di terze parti: basta attivare l'estensione, unirsi a una lobby e iniziare a guardare.",
"ALT_W2G_MAIN_DIFF_TITLE": "La differenza principale",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether è un <strong>sito web autonomo</strong> con chat, playlist e supporto webcam integrati. KoalaSync è un'<strong>estensione del browser minimalista</strong> che si collega direttamente alle normali schede del browser.<br><br>Cerchi un pacchetto tutto in uno per YouTube con chat integrata? Usa Watch2Gether. Vuoi guardare film su Netflix o sul tuo server senza distrazioni, in qualità nativa (senza compressione del server)? KoalaSync è la soluzione più pulita.",
"ALT_W2G_LIMITS_TITLE": "Limitazioni oneste",
"ALT_W2G_LIMITS_BODY": "KoalaSync <strong>non dispone di playlist integrate o ricerca video</strong>. Su YouTube, ciò significa che la riproduzione automatica del video successivo non rimarrà sincronizzata.<br><br>Inoltre, <strong>non è presente una chat integrata</strong> e KoalaSync attualmente funziona solo sui browser desktop. È progettato partendo dal presupposto che tu stia già parlando tramite Discord, Teamspeak o comunque altri strumenti vocali.",
"ALT_W2G_SUMMARY_TITLE": "Insomma",
"ALT_W2G_SUMMARY_BODY": "Per sessioni YouTube spontanee con playlist e chat integrata, Watch2Gether è la scelta migliore. Per piattaforme di streaming premium (come Netflix, Prime Video, Disney+), server self-hosted (Jellyfin, Plex, Emby) e la massima flessibilità del browser, KoalaSync è lo strumento più adatto e leggero.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener: quale piattaforma di watch party si adatta meglio?",
"ALT_SCENER_META_DESC": "Un confronto onesto tra KoalaSync e Scener. Scopri quando vince la chat webcam di Scener e perché KoalaSync è la soluzione migliore per serate di cinema senza distrazioni.",
"ALT_SCENER_INTRO": "KoalaSync e Scener si avvicinano alle feste da due angolazioni completamente diverse. Scener è un cinema virtuale con chat video integrata e stanze interattive. KoalaSync, d'altra parte, è un'estensione del browser minimalista e rispettosa della privacy che sincronizza semplicemente i controlli di riproduzione. Lo strumento più adatto a te dipende principalmente da quanto siano importanti per te le funzionalità di webcam e chat integrate.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Quando Scener è la scelta migliore",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener è una scelta solida se desideri una <strong>piattaforma social tutto in uno</strong> con chat audio e video integrata direttamente nel tuo browser. Scener crea una stanza virtuale in cui il giocatore e le webcam dei tuoi amici vengono visualizzati fianco a fianco. Questo è l'ideale per grandi feste pubbliche o eventi di streaming virtuale in cui l'aspetto sociale è al centro dell'attenzione. Tuttavia, tieni presente che la versione base gratuita è supportata dalla pubblicità e Scener blocca molte funzionalità (come la visualizzazione senza pubblicità e la chat video illimitata) dietro un abbonamento mensile ($ 5,79 al mese o $ 39,99 all'anno).",
"ALT_SCENER_WHEN_KOALA_TITLE": "Quando KoalaSync si adatta meglio",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync eccelle quando si tratta di <strong>qualità video, privacy e semplicità</strong>:<br><br>• <strong>Nessun account</strong>: non è necessario registrarsi, accedere o gestire i profili. Basta attivare l'estensione, condividere un codice della stanza e iniziare a guardare.<br>• <strong>Qualità nativa reale (4K/HDR)</strong>: Scener trasmette in streaming video compressi da un server cloud virtuale, il che può portare a perdita di qualità e ritardi. KoalaSync sincronizza il lettore nativo direttamente sul tuo computer, il che significa che guardi i film alla massima risoluzione del tuo abbonamento di streaming.<br>• <strong>Basso utilizzo della larghezza di banda</strong>: poiché vengono trasmessi solo i dati di controllo (riproduzione, pausa, timestamp), KoalaSync non utilizza praticamente alcuna larghezza di banda aggiuntiva. Scener trasmette in streaming l'intero video e i feed della fotocamera su server cloud, che possono mettere a dura prova le connessioni Internet più lente e i laptop più vecchi.<br>• <strong>100% gratuito e senza pubblicità</strong>: nessun costo di abbonamento mensile, nessuna pubblicità e nessun tracker.<br>• <strong>File video locali</strong>: poiché KoalaSync viene eseguito localmente, puoi persino guardare i tuoi file video (come MP4) sincronizzati con gli amici. Basta trascinare e rilasciare il file in una scheda del browser: Scener non può farlo perché il suo lettore viene eseguito nel cloud.",
"ALT_SCENER_MAIN_DIFF_TITLE": "La differenza principale",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener è un <strong>social network commerciale</strong> per watch party basato su browser cloud virtuali e finanziato tramite annunci e abbonamenti mensili. KoalaSync è un'<strong>utilità di sincronizzazione gratuita, attenta alla privacy</strong> che si collega direttamente alle schede del tuo browser. Lascia la chat vocale/video ad applicazioni come Discord o Teamspeak, concentrandosi interamente sul mantenere la riproduzione fluida, privata e nella sua qualità originale nativa.",
"ALT_SCENER_LIMITS_TITLE": "Limitazioni oneste",
"ALT_SCENER_LIMITS_BODY": "KoalaSync non offre <strong>nessun supporto integrato per chat o webcam</strong>. È puramente uno strumento di sincronizzazione e richiede uno strumento di chiamata vocale separato a tua scelta. Inoltre, KoalaSync è attualmente solo desktop e la compatibilità dei file video locali dipende interamente dal fatto che il tuo browser supporti nativamente la riproduzione del formato video e dei codec audio.",
"ALT_SCENER_SUMMARY_TITLE": "Insomma",
"ALT_SCENER_SUMMARY_BODY": "Per i grandi gruppi di spettatori con chat webcam integrata e funzionalità social, Scener è la scelta giusta, a condizione che non ti dispiaccia la pubblicità e i paywall premium. Se desideri un'esperienza completamente gratuita, senza pubblicità e senza distrazioni nel lettore nativo (inclusi Netflix, Prime Video, Disney+ o file del browser locale) e stai già effettuando una chiamata vocale, KoalaSync è la soluzione più pulita e performante.",
"ALT_KOSMI_TITLE": "KoalaSync vs Kosmi: quale alternativa alla festa Netflix si adatta meglio?",
"ALT_KOSMI_META_DESC": "Un confronto onesto tra KoalaSync e Kosmi. Scopri perché la configurazione senza estensione di Kosmi è conveniente e quando vince la qualità video nativa di KoalaSync.",
"ALT_KOSMI_INTRO": "Sia KoalaSync che Kosmi offrono ottimi modi per guardare Netflix, YouTube e altre piattaforme in sincronia con gli amici. Tuttavia, le tecnologie sottostanti sono fondamentalmente diverse. Kosmi utilizza browser cloud virtuali che vengono eseguiti direttamente nel tuo browser web senza installare estensioni. KoalaSync è un'estensione leggera che sincronizza il tuo lettore video locale. L'approccio più adatto a te dipende dalle tue priorità in termini di qualità video, comodità e privacy.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Quando Kosmi è la scelta migliore",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi è imbattibile se vuoi <strong>evitare di installare nulla</strong> o vuoi guardare su dispositivi come tablet e smartphone. Poiché Kosmi esegue browser virtuali nel cloud, per aderire è sufficiente un semplice collegamento Web. Inoltre, Kosmi è una piattaforma di ritrovo all-in-one: oltre allo streaming sincronizzato, puoi giocare a giochi multiplayer (come i classici retrò NES/SNES o il poker) e utilizzare la webcam integrata, la voce e la chat di testo. Se vuoi una serata di gioco sociale e guardare una festa senza installazione, Kosmi è una soluzione fantastica.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "Quando KoalaSync si adatta meglio",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync eccelle quando si tratta di <strong>qualità di riproduzione, sicurezza e prestazioni native</strong>:<br><br>• <strong>Nessun rischio per la sicurezza</strong>: con Kosmi, devi accedere al tuo account Netflix o Prime su un computer virtuale remoto nel cloud. Con KoalaSync, accedi in modo sicuro al sito ufficiale di streaming nel tuo browser, proprio come fai normalmente. Le tue password non lasciano mai il tuo computer.<br>• <strong>Qualità video completa (4K/HDR)</strong>: Kosmi trasmette in streaming lo schermo del browser virtuale come feed video compresso, il che può provocare pixelizzazione e buffering. KoalaSync sincronizza i lettori nativi localmente: potrai goderti i film con la risoluzione completa e cristallina del tuo abbonamento.<br>• <strong>Senza ritardi e con larghezza di banda ridotta</strong>: poiché KoalaSync invia solo comandi di controllo (riproduzione/pausa/timestamp), utilizza quasi zero larghezza di banda. Kosmi trasmette costantemente in streaming feed video HD, che possono sovraccaricare le connessioni più lente.<br>• <strong>File video locali</strong>: se desideri guardare un video privato, trascina e rilascia il file MP4 in una scheda del browser e sincronizzalo. Kosmi non può accedere ai file sul tuo disco rigido locale.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "La differenza principale",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi è un <strong>hangout virtuale sul cloud</strong> che trasmette in streaming lo schermo di un browser remoto, quindi nessuno deve installare un'estensione. KoalaSync è un <strong>livello di sincronizzazione del browser locale</strong> che si collega direttamente al player nativo sul sito web di streaming ufficiale. Mentre Kosmi è più versatile per quanto riguarda i minigiochi e la compatibilità dei dispositivi, KoalaSync offre un'esperienza di streaming più sicura, fluida e nitida nel lettore originale.",
"ALT_KOSMI_LIMITS_TITLE": "Limitazioni oneste",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync <strong>richiede l'installazione di un'estensione del browser</strong> e attualmente funziona solo su PC desktop. <strong>Non ha chat o webcam integrate</strong>, poiché è progettato partendo dal presupposto che tu stia già parlando tramite Discord o altri strumenti vocali. Inoltre non offre giochi integrati.",
"ALT_KOSMI_SUMMARY_TITLE": "Insomma",
"ALT_KOSMI_SUMMARY_BODY": "Per serate di gioco informali con classici retrò e un facile accesso su dispositivi mobili senza alcuna installazione, Kosmi è l'ideale. Per serate di cinema premium su Netflix, Prime Video, Disney+ o Plex in qualità 4K completa, con la massima sicurezza e un impatto minimo sulla larghezza di banda, KoalaSync è il chiaro vincitore.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven: quale soluzione di watch party è più adatta?",
"ALT_TWOSEVEN_META_DESC": "Un confronto onesto tra KoalaSync e TwoSeven. Scopri quando vince la webcam integrata di TwoSeven e perché KoalaSync è la soluzione migliore per Disney+ e Netflix.",
"ALT_TWOSEVEN_INTRO": "Sia KoalaSync che TwoSeven utilizzano lo stesso approccio di base per i watch party: sincronizzano il lettore video originale direttamente nel browser, anziché eseguire lo streaming di un feed video compresso dal cloud. Ciò garantisce una qualità video di alto livello per entrambi gli strumenti. Tuttavia, mentre TwoSeven è un portale commerciale con chat webcam integrata e livelli di abbonamento, KoalaSync rimane un'estensione minimalista, completamente gratuita e rispettosa della privacy. Scopri qui il servizio più adatto a te.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "Quando TwoSeven è la scelta migliore",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven è la scelta giusta se desideri una <strong>soluzione all-in-one con webcam e chat audio integrate</strong> direttamente nel tuo browser. Se vuoi vedere i tuoi amici mentre guardi senza dover eseguire Discord o Teamspeak in background, TwoSeven offre questa integrazione in modo nativo. Inoltre, funziona con YouTube e alcuni lettori video Web aperti senza estensioni. È adatto a piccoli gruppi di 2 o 3 persone che desiderano condividere una connessione visiva durante la visione.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "Quando KoalaSync si adatta meglio",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync brilla per la sua <strong>totale assenza di costi, privacy e semplicità</strong>:<br><br>• <strong>Nessun paywall</strong>: per guardare servizi premium come Disney+ o Hulu in sincronia su TwoSeven, almeno un membro della stanza deve supportarli su Patreon (a partire da $ 3/mese). KoalaSync sincronizza Netflix, Prime Video, Disney+ e server multimediali self-hosted (Jellyfin, Plex, Emby) in modo gratuito al 100% e senza restrizioni.<br>• <strong>Privacy assoluta (nessun tracker/annuncio)</strong>: TwoSeven supporta la pubblicità e utilizza più tracker di Google, Facebook e altri. KoalaSync non ha pubblicità, né tracker e comunica esclusivamente con il server di inoltro solo RAM.<br>• <strong>Non è richiesta alcuna registrazione</strong>: TwoSeven richiede a tutti i partecipanti di creare un account ed effettuare l'accesso. KoalaSync è completamente privo di account. Basta installarlo, inserire il codice della stanza e iniziare a guardare.<br>• <strong>Leggero e di facile utilizzo</strong>: la webcam integrata e i feed audio di TwoSeven mettono a dura prova la CPU e la rete. Lasciando la comunicazione a strumenti come Discord, KoalaSync funziona in modo estremamente fluido e preserva la durata della batteria.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "La differenza principale",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven è una <strong>piattaforma commerciale</strong> con requisiti di registrazione, annunci, chat webcam peer-to-peer e paywall Patreon per servizi di streaming specifici. KoalaSync è un'<strong>utilità gratuita e open source</strong> che si collega direttamente alle schede del tuo browser senza account, tracker o costi aggiuntivi, consentendo una visione senza distrazioni nel lettore nativo.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Limitazioni oneste",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync non offre <strong>nessuna webcam integrata o chat audio</strong> e presuppone che tu sia già impegnato in una chiamata tramite Discord o uno strumento simile. Inoltre, KoalaSync non ha una finestra di chat incorporata ed è attualmente solo desktop.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "Insomma",
"ALT_TWOSEVEN_SUMMARY_BODY": "Per piccoli gruppi di due o tre persone che vogliono vedersi tramite webcam direttamente nel browser e non hanno problemi a supportare Patreon per Disney+, TwoSeven è una buona opzione. Per serate di cinema private, completamente gratuite e senza pubblicità in qualità 4K nativa (che si tratti di Netflix, Prime Video, Disney+ o Jellyfin) senza registrazioni, KoalaSync è la scelta più pulita e sicura.",
"ALT_TRY_KOALASYNC": "Prova KoalaSync",
"MOCK_HOST_CONTROL_LABEL": "Controllo host",
"MOCK_HOST_CONTROL_TOGGLE": "Solo io posso controllare la riproduzione",
"LABEL_SELECT_VIDEO": "Seleziona Video",
"OPTION_SELECT_TAB": "-- Seleziona una Scheda --",
"THEME_TOGGLE_LABEL": "Attiva/disattiva tema chiaro/scuro",
"FAQ_SHOW_ALL": "Mostra tutte le domande",
"FAQ_HIDE_ALL": "Nascondi le domande",
"SELF_SHOW_SETUP": "Mostra la guida all'installazione",
"SELF_HIDE_SETUP": "Nascondi la guida",
"HERO_TRUST": "Gratuito · Open source · Senza account",
"COMP_MORE_GUIDES": "Confronto completo e altre alternative"
}
+107 -27
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "ja_JP",
"META_TITLE": "KoalaSync | NetflixYouTube、あらゆる動画を友達と同期視聴",
"META_DESCRIPTION": "Netflix、YouTube、Twitch、およびあらゆるHTML5動画を友達と完全に同期して視聴。ChromeおよびFirefoxの無料オープンソースブラウザ拡張機能。登録不要。",
"SCHEMA_APP_DESC": "Netflix、YouTube、Twitch、およびあらゆるHTML5動画を友達と完全に同期して視聴。ChromeおよびFirefoxの無料オープンソースブラウザ拡張機能。登録不要。",
"OG_TITLE": "KoalaSync | Netflix、Emby、Jellyfin、ほぼすべての動画を友達と同期",
"OG_DESCRIPTION": "Netflix、Emby、Jellyfin、YouTube、Twitch、ほぼすべてのHTML5動画を完全に同期して視聴。ChromeおよびFirefox用のプライバシー優先のオープンソースブラウザ拡張機能。",
"TWITTER_TITLE": "KoalaSync | Netflix、Emby、Jellyfin、ほぼすべての動画を友達と同期 ブラウザ拡張機能",
"TWITTER_DESCRIPTION": "Netflix、Emby、Jellyfin、YouTube、Twitch、ほぼすべてのHTML5動画を友達と完全に同期して視聴。ChromeおよびFirefox用のプライバシー優先のオープンソースブラウザ拡張機能。",
"META_TITLE": "KoalaSync | NetflixYouTube対応ウォッチパーティー拡張機能",
"META_DESCRIPTION": "Netflix、YouTube、TwitchなどあらゆるHTML5動画でウォッチパーティー。ChromeFirefox向けの無料オープンソース拡張機能。アカウント不要、トラッキングなし、広告なし。",
"SCHEMA_APP_DESC": "Netflix、YouTube、TwitchなどあらゆるHTML5動画でウォッチパーティー。ChromeFirefox向けの無料オープンソース拡張機能。アカウント不要、トラッキングなし、広告なし。",
"OG_TITLE": "KoalaSync | Netflix、Emby、Jellyfin、ほぼすべての動画でウォッチパーティー",
"OG_DESCRIPTION": "Netflix、Emby、Jellyfin、YouTube、Twitch、ほぼすべてのHTML5動画でウォッチパーティーを開催。オープンソース、プライバシー重視、アカウント不要。",
"TWITTER_TITLE": "KoalaSync | Netflix、Emby、Jellyfin、ほぼすべての動画でウォッチパーティー 拡張機能",
"TWITTER_DESCRIPTION": "Netflix、Emby、Jellyfin、YouTube、Twitch、ほぼすべてのHTML5動画でウォッチパーティーを開催。オープンソース、プライバシー重視、アカウント不要。",
"NAV_FEATURES": "機能",
"NAV_HOW_IT_WORKS": "仕組み",
"HERO_TITLE": "一緒に観よう。<span class='hero-line2'>完璧に同期。</span>",
"HERO_SUBTITLE": "遅延のないリモート映画鑑賞。登録不要、データ収集なし。リンクを共有するだけで、一緒に視聴できます。",
"HERO_TITLE": "どんな動画も<span class='hero-highlight'>ウォッチパーティー</span>に。",
"HERO_SUBTITLE": "離れていても一緒に映画ナイト。アカウント不要、トラッキングなし、広告なし。リンクを共有して、一緒に再生するだけ。",
"HERO_MASCOT_ALT": "ダウンロードボタンを見下ろしているかわいいコアラ",
"DEMO_SYNC": "同期中",
"DEMO_HINT": "ライブデモ:どちらかのタブで再生すると、KoalaSyncが両方を同期させます。",
"DEMO_NO_ROOM": "未接続",
"DEMO_CREATE_ROOM": "ルームを作成",
"DEMO_JOINED": "ルームに参加",
"DEMO_TAB_SELECTED": "タブを選択済み",
"DEMO_SELECT_PLACEHOLDER": "動画タブを選ぶ…",
"MOBILE_DEMO_CTA": "仕組みを見る",
"MOBILE_DEMO_TITLE": "KoalaSync ライブデモ",
"MOBILE_DEMO_CLOSE": "デモを閉じる",
"ADD_TO_CHROME": "Chromeに追加",
"ADD_TO_FIREFOX": "Firefoxに追加",
"COMPAT_HEADING": "お気に入りのプラットフォームで動作",
@@ -35,20 +45,20 @@
"USE_CASE_3_DESC": "距離を縮めてデートナイトを楽しみましょう。すべてのストーリー展開を体験し、同じジョックで笑い、感情的な瞬間をまったく同じミリ秒で共有します。",
"WHY_TITLE": "KoalaSyncを選ぶ理由",
"WHY_SUBTITLE": "信頼性の高い同期、プライバシー優先の設計、簡単なセットアップのために構築。",
"FEATURE_1_TITLE": "完全なコントロール / 即時同期",
"FEATURE_1_DESC": "一人が一時停止すれば、全員が一時停止。一人がシークすれば、全員が追従。2フェーズ同期プロトコルが、リアルタイムで全員の再生状況を連動させます。",
"FEATURE_1_TITLE": "ホスト制御と同期",
"FEATURE_1_DESC": "再生をコントロールする人を決定できます。ホスト操作を有効にして自分だけが一時停止やスキップを行えるようにするか、共同ホストを任命します。",
"FEATURE_2_TITLE": "終わらない連続視聴",
"FEATURE_2_DESC": "同期した自動再生。KoalaSyncはエピソードの切り替えを自動検知し、全員が次の動画を読み込むまで再生を待機します。",
"FEATURE_3_TITLE": "アカウント不要 / 純粋なプライバシー",
"FEATURE_3_DESC": "登録不要、追跡なし、履歴も残りません。サーバーは一時的なメモリ(RAM)上でのみ動作し、退出時にルームを完全に消去します。",
"FEATURE_4_TITLE": "ユニバーサルHTML5サポート",
"FEATURE_4_DESC": "YouTube、Twitch、Netflix、Jellyfin、Emby、およびHTML5ビデオ要素を含むほぼすべての標準的なWebページで動作します。独自のセルフホスト設定とも互換性があります。No video data is ever sent to our servers — only synchronization metadata.",
"FEATURE_4_DESC": "Netflix、YouTube、Twitch、Jellyfin、Emby、そしてHTML5動画があるほぼすべてのページに対応。ブラウザから出るのは同期信号だけで、動画自体は送信されません。",
"FEATURE_5_TITLE": "セルフホスト可能&Docker対応",
"FEATURE_5_DESC": "公式サーバーは無料で高速ですが、必要に応じて独自のサーバーを構築できます。Dockerを使用して、数秒でプライベートリレーサーバーを起動できます。",
"FEATURE_6_TITLE": "インスタント招待 / 1クリック参加",
"FEATURE_6_DESC": "IPアドレスやパスワードをやり取りする必要はありません。生成された招待リンクを友達に共有するだけで、1クリックで自動的にルームに参加できます。",
"FEATURE_7_TITLE": "音量均等化 / オーディオコンプレッサー",
"FEATURE_7_DESC": "音量つまみをいじる必要はもうありません。内蔵オーディオコンプレッサーが小さな会話を強調し、大きな爆発音を抑えます。Netflix、Prime Video、Disney+、YouTube、あらゆるHTML5ビデオで動作。完全にローカル処理 — オーディオデータがコンピュータから送信されることはありません。",
"FEATURE_7_DESC": "音量つまみをいじる必要はもうありません。内蔵コンプレッサーが小さな会話を持ち上げ、大きな爆発音を抑えます。すべてブラウザ内でローカル処理されます。",
"FEATURE_8_TITLE": "オープンソース(MITライセンス)",
"FEATURE_8_DESC": "すべてのコードベースはGitHubで公開されており、誰でも監査可能です。ブラックボックスや独自のバイナリデータ(blob)は一切なく、中継サーバーからブラウザ拡張機能まで100%の透明性を確保しています。",
"COMP_TITLE": "KoalaSync と Teleparty の比較",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Telepartyのプライバシーポリシーと追跡データの収集について:",
"COMP_FOOTNOTE_4": "標準的なHTML5ビデオタグへのスクリプトインジェクションを許可するウェブサイトで動作します。非常に厳格なコンテンツセキュリティポリシー(CSP)、DRMコピー保護、または高度に難読化されたプレーヤーラッパー(複雑なシャドウDOMなど)を持つウェブサイトでは、自動制御やインジェクションが制限される場合があります。",
"STEPS_TITLE": "はじめに",
"STEP_1_TITLE": "拡張機能をインストール",
"STEP_1_DESC": "Chrome ウェブストアや Firefox Add-ons から KoalaSync をブラウザに追加するか、GitHub から最新の開発者向け ZIP をダウンロードしてください。",
"STEP_1_ILLUS_DESC": "プライバシー優先のビデオ同期ツール",
"STEP_1_ILLUS_DL_CHROME": "Chrome版をダウンロード",
"STEP_1_ILLUS_DL_FIREFOX": "Firefox版をダウンロード",
"STEP_1_ILLUS_ACTIVE": "拡張機能はアクティブです",
"STEP_1_ILLUS_READY": "一緒に観る準備完了",
"STEP_2_TITLE": "ルームを作成",
"STEP_2_DESC": "拡張機能のポップアップを開き、「+ 新規ルーム作成」をクリックします。KoalaSync自動的に安全なルームIDとパスワードを生成し、接続し、招待リンクをクリップボードにコピーします。",
"STEP_1_TITLE": "ルーム作成と共有",
"STEP_1_DESC": "拡張機能を開き、ワンクリックでルームを作成してリンクを共有します。友達は招待リンクからすぐに参加できます。",
"STEP_1_ILLUS_DESC": "連携するタブを選択",
"STEP_1_ILLUS_DL_CHROME": "YouTubeタブを連携",
"STEP_1_ILLUS_DL_FIREFOX": "Netflixタブを連携",
"STEP_1_ILLUS_ACTIVE": "タブ連携完了",
"STEP_1_ILLUS_READY": "同期再生の準備完了 !",
"STEP_2_TITLE": "動画タブの選択",
"STEP_2_DESC": "動画のあるタブを開き、拡張機能のメニューでそのタブを選択します。KoalaSync自動的にお互いのプレイヤーを連携させます。",
"STEP_2_ILLUS_ROOM": "ルーム",
"STEP_2_ILLUS_SYNC": "同期",
"STEP_2_ILLUS_SETTINGS": "設定",
"STEP_2_ILLUS_CREATE": "+ 新規ルーム作成",
"STEP_2_ILLUS_MANUAL": "手動接続 / 詳細設定",
"STEP_2_ILLUS_COPIED": "招待リンクをコピーしました!",
"STEP_3_TITLE": "共有と同期",
"STEP_3_DESC": "招待リンクを友達に送信します。友達が参加したら、ビデオのタブを選択して、同期された再生を楽しんでください。",
"STEP_3_TITLE": "同期を楽しむ",
"STEP_3_DESC": "再生ボタンを押します。誰かが一時停止、早送り、または再生をしても、全員の動画がタイムラグなしで完璧に同期します。",
"STEP_3_ILLUS_IN_SYNC": "同期中",
"SELF_TITLE": "セルフホストする方向け",
"SELF_SUBTITLE": "公式サーバーを信頼しませんか?データの完全な所有権を維持しましょう。数分で独自のプライベートリレーサーバーを構築できます。",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SYNC",
"MOCK_14": "他の人に合わせる",
"MOCK_15": "最新のアクティビティ状況",
"MOCK_16": "1人のメンバー (KoalaPC) を待機中...",
"MOCK_16": "1人のメンバー (🐶 HappyDog) を待機中...",
"MOCK_17": "スキップして再生",
"MOCK_18": "ユーザー名",
"MOCK_19": "不要なタブを非表示",
@@ -179,7 +189,14 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSyncは、Netflix、Disney+、Amazon、YouTube、Twitch、またはその他のストリーミングプラットフォームと提携、承認、または関連付けられているものではありません。すべての商標はそれぞれの所有者に帰属します。",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_TELEPARTY_TITLE": "KoalaSync vs Teleparty:どちらのウォッチパーティツールを使うべき?",
"ALT_INDEX_TITLE": "KoalaSync - 代替サービスと比較",
"ALT_INDEX_META_DESC": "KoalaSync と他のウォッチパーティー拡張機能やストリーミング向けソリューションを、公平な比較と詳しいガイドで確認できます。",
"ALT_INDEX_HEADING": "ガイドと比較",
"ALT_INDEX_INTRO": "KoalaSync は他のウォッチパーティーツールやストリーミング向けソリューションと比べてどう違うのでしょうか。リモート映画鑑賞に合う選択肢を見つけるために、公平で技術的な比較をご覧ください。",
"ALT_INDEX_READ_COMPARISON": "比較を読む →",
"ALT_INDEX_READ_GUIDE": "ガイドを読む →",
"ALT_INDEX_FOOTER_LINK": "ガイドと比較",
"ALT_TELEPARTY_TITLE": "KoalaSync vs Teleparty:どちらのウォッチパーティツールを使うべき?",
"ALT_TELEPARTY_META_DESC": "ウォッチパーティ向けツール、KoalaSyncとTelepartyの実践的比較。チャット機能、モバイル対応、ブラウザでの動画同期、セルフホスト型メディアサーバー、オープンソース利用といった観点から解説します。",
"ALT_TELEPARTY_INTRO": "KoalaSyncとTelepartyは、どちらも「3、2、1、再生!」と声を掛け合う手間をかけずに、一緒に動画を楽しむという共通の課題を解決してくれます。ただ、そのアプローチは異なります。<br><br>チャット機能が組み込まれていることや、モバイル端末で視聴できることを重視するなら、Telepartyが最適です。一方、KoalaSyncは、DiscordやTeamSpeakなどで既に通話しながら、ブラウザ上で動画の再生タイミングだけを同期させたいという、デスクトップブラウザでの利用に適しています。<br><br>私がKoalaSyncを開発した主な理由は「柔軟性」です。特定のプラットフォームだけでなく、一般的なブラウザ用動画プレーヤーを使用するほぼすべてのウェブサイトで動作するように設計されています。これには、Emby、Jellyfin、Plexといったセルフホスト環境や、ローカル/プライベートドメイン、そしてブラウザ上の一般的な動画ページなどが含まれます。",
"ALT_TELEPARTY_WHEN_TELE_TITLE": "Telepartyが適しているケース",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSyncは音声通話の代わりになるものではありません。視聴しながら会話をする場合は、Discord、TeamSpeak、Signal、WhatsAppなど、普段お使いのツールをそのまま利用します。<br><br>また、参加者全員がそれぞれのデバイスでその動画やページにアクセスできる必要があります。KoalaSyncは、サブスクリプション、ログイン、DRM(デジタル著作権管理)、地域制限、プラットフォームの利用規約などを回避するものではありません。<br><br>現在はデスクトップ版ブラウザのみに対応しており、チャットや音声通話機能は内蔵されていません。また、動作の可否は使用するブラウザや動画プレーヤーに依存します。",
"ALT_SCREEN_SUMMARY_TITLE": "概要",
"ALT_SCREEN_SUMMARY_BODY": "画質やプライバシー、個別の操作性をあまり気にせず、手軽に済ませたい場合は「画面共有」が最も簡単な選択肢です。一方、参加者それぞれが自身のブラウザで動画を再生し、実際に同じ空間で一緒に視聴しているような感覚を重視するなら、KoalaSyncの方が適しています。",
"ALT_TRY_KOALASYNC": "KoalaSyncを試す"
"ALT_W2G_TITLE": "KoalaSync と Watch2Gether: どちらのウォッチ パーティー ソリューションがより適していますか?",
"ALT_W2G_META_DESC": "KoalaSync と Watch2Gether の正直な比較。 KoalaSync の柔軟性が優れている理由と、Watch2Gether が YouTube にとって依然としてトップの選択肢である理由をご覧ください。",
"ALT_W2G_INTRO": "KoalaSync と Watch2Gether は両方とも同じ問題を解決します。つまり、手動で調整することなく、オンラインで友達と同期してビデオを視聴できます。 Watch2Gether は映画鑑賞を共有するための最も古く、最も人気のあるハブの 1 つですが、KoalaSync はまったく異なる軽量のアプローチを採用しています。どのツールがあなたに適しているかは、何をどこで見たいかによって大きく異なります。",
"ALT_W2G_WHEN_W2G_TITLE": "Watch2Gether がより良い選択である場合",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether は<strong>YouTube ウォッチ パーティー</strong>にとって無敵です。内蔵のプレイリストと検索により、部屋にいる誰もが新しいビデオを簡単に検索、追加、再生できます。全員が一緒にシームレスに次の動画を視聴します。<br><br>YouTube の KoalaSync を使用すると、サイトのデフォルトの自動再生が引き継ぎ、各ユーザーを別のおすすめ動画にリダイレクトします。自動次エピソード機能 (「エピソード ロビー」) は、Netflix や Disney+ ではうまく機能しますが、こうした動的な推奨事項のため、YouTube では機能しません。純粋に YouTube の夜を楽しみたい場合は、Watch2Gether が最適です。",
"ALT_W2G_WHEN_KOALA_TITLE": "KoalaSync がより適切にフィットすると",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync は<strong>実際のストリーミング サービス</strong> (Netflix、Prime Video、Disney+) および自己ホスト型メディア サーバー (Jellyfin、Plex、Emby) で威力を発揮します。プレミアム コンテンツをまったく再生できないことが多い Watch2Gether とは異なり、KoalaSync はウェブサイト上でネイティブ プレーヤーを直接同期します。<br><br>標準の HTML5 ビデオ プレーヤーを備えたほぼすべてのサイトで動作します。サードパーティのサイトに仮想ルームを設定する必要はありません。拡張機能をアクティブにしてロビーに参加し、視聴を開始するだけです。",
"ALT_W2G_MAIN_DIFF_TITLE": "主な違い",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether は、チャット、プレイリスト、Web カメラのサポートが組み込まれた<strong>スタンドアロン Web サイト</strong>です。 KoalaSync は、通常のブラウザ タブに直接接続する<strong>シンプルなブラウザ拡張機能</strong>です。<br><br>チャットが組み込まれた YouTube 用のオールインワン パッケージをお探しですか? Watch2Gether を使用します。 Netflix または独自のサーバーで、気が散ることなく、ネイティブ品質 (サーバー圧縮なし) で映画を視聴したいですか? KoalaSync はよりクリーンなソリューションです。",
"ALT_W2G_LIMITS_TITLE": "正直な限界",
"ALT_W2G_LIMITS_BODY": "KoalaSync には<strong>プレイリストやビデオ検索が組み込まれていません</strong>。 YouTube では、これは、次のビデオの自動再生の同期が維持されないことを意味します。<br><br>さらに、<strong>組み込みのチャットはありません</strong>。また、KoalaSync は現在デスクトップ ブラウザでのみ動作します。とにかく、Discord、Teamspeak、またはその他の音声ツールを介してすでに会話しているという前提に基づいて設計されています。",
"ALT_W2G_SUMMARY_TITLE": "要するに",
"ALT_W2G_SUMMARY_BODY": "プレイリストと組み込みチャットを使用した自発的な YouTube セッションには、Watch2Gether が最適な選択です。プレミアム ストリーミング プラットフォーム (Netflix、Prime Video、Disney+ など)、セルフホスト サーバー (Jellyfin、Plex、Emby)、お​​よびブラウザの柔軟性を最大限に高めるには、KoalaSync がより適切で軽量なツールです。",
"ALT_SCENER_TITLE": "KoalaSync と Scener: どちらのウォッチ パーティー プラットフォームがより適していますか?",
"ALT_SCENER_META_DESC": "KoalaSync と Scener の正直な比較。 Scener の Web カメラ チャットが最適なタイミングと、気を散らすことなく映画鑑賞に KoalaSync が最適な理由をご確認ください。",
"ALT_SCENER_INTRO": "KoalaSync と Scener は、まったく異なる 2 つの角度からウォッチ パーティーにアプローチします。 Scener は、ビデオ チャットとインタラクティブ ルームが組み込まれた仮想映画館です。一方、KoalaSync は、再生コントロールを単純に同期する、最小限のプライバシーに配慮したブラウザ拡張機能です。どのツールがあなたに最適であるかは、主に、内蔵の Web カメラとチャット機能があなたにとってどれだけ重要であるかによって決まります。",
"ALT_SCENER_WHEN_SCENER_TITLE": "Scener がより良い選択である場合",
"ALT_SCENER_WHEN_SCENER_BODY": "ブラウザにビデオとオーディオのチャットが直接組み込まれている<strong>オールインワンのソーシャル プラットフォーム</strong>が必要な場合は、Scener が確実な選択肢です。 Scener は、プレーヤーと友達の Web カメラが並べて表示される仮想ルームを作成します。これは、ソーシャルな側面が中心となる大規模な公開ウォッチ パーティーや仮想ストリーミング イベントに最適です。ただし、無料の基本バージョンは広告でサポートされており、Scener では月額サブスクリプション (月額 5.79 ドルまたは年間 39.99 ドル) を支払うと、多くの機能 (広告なしの視聴や無制限のビデオ チャットなど) がロックされること注意してください。",
"ALT_SCENER_WHEN_KOALA_TITLE": "KoalaSync がより適切にフィットすると",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync は、<strong>ビデオ品質、プライバシー、 シンプルさ</strong>という点で優れています。<br><br>• <strong>アカウントなし</strong>: 登録、ログイン、プロファイルの管理は必要ありません。拡張機能を有効にしてルーム コードを共有し、視聴を開始するだけです。<br>• <strong>真のネイティブ品質 (4K/HDR)</strong>: Scener は仮想クラウド サーバーから圧縮ビデオをストリーミングしますが、これにより品質の低下や遅延が発生する可能性があります。 KoalaSync は、ネイティブ プレーヤーをコンピュータ上で直接同期します。つまり、ストリーング サブスクリプションのフル解像度で映画を視聴できます。<br>• <strong>低帯域幅使用量</strong>: 制御データ (再生、一時停止、タイムスタンプ) のみが送信されるため、KoalaSync は追加の帯域幅を実質的に使用しません。 Scener はビデオ全体とカメラ フィードをクラウド サーバー経由でストリーミングします。これにより、遅いインターネット接続や古いラップトップに大きな負担がかかる可能性があります。<br>• <strong>完全に無料、広告なし</strong>: 月々の購読料、広告、トラッカーはありません。<br>• <strong>ローカル ビデオ ファイル</strong>: KoalaSync はローカルで実行されるため、自分のビデオ ファイル (MP4 など) を友達と同期して見ることもできます。ファイルをブラウザのタブにドラッグ アンド ドロップするだけです。Scener のプレーヤーはクラウドで実行されるため、これはできません。",
"ALT_SCENER_MAIN_DIFF_TITLE": "主な違い",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener は、仮想クラウド ブラウザを利用し、広告と月々のサブスクリプションによって資金を調達しているウォッチ パーティー用の<strong>商用ソーシャル ネットワーク</strong>です。 KoalaSync はブラウザのタブに直接接続できる<strong>プライバシー最優先の無料同期ユーティリティ</strong>です。音声/ビデオ チャットを Discord や Teamspeak などのアプリケーションに任せ、再生を滑らかに、プライベートに、ネイティブのオリジナル品質で維持することに完全に重点を置きます。",
"ALT_SCENER_LIMITS_TITLE": "正直な限界",
"ALT_SCENER_LIMITS_BODY": "KoalaSync は<strong>組み込みのチャットやウェブカメラのサポートを提供しません</strong>。これは純粋に同期ツールであり、選択した別の音声通話ツールが必要です。さらに、KoalaSync は現在デスクトップ専用であり、ローカル ビデオ ファイルの互換性は、ブラウザがビデオ形式とオーディオ コーデックの再生をネイティブにサポートしているかどうかによって完全に決まります。",
"ALT_SCENER_SUMMARY_TITLE": "要するに",
"ALT_SCENER_SUMMARY_BODY": "ウェブカメラチャットやソーシャル機能が組み込まれた大規模なウォッチパーティーの場合、広告やプレミアムペイウォールを気にしない限り、Scener が正しい選択です。ネイティブ プレーヤー (Netflix、Prime Video、Disney+、またはローカル ブラウザ ファイルを含む) で完全に無料、広告なし、気を散らすことのないエクスペリエンスを希望し、すでに音声通話を行っている場合は、KoalaSync がよりクリーンでパフォーマンスの高いソリューションです。",
"ALT_KOSMI_TITLE": "KoalaSync と Kosmi: Netflix パーティーに代わる選択肢として、どちらがより適していますか?",
"ALT_KOSMI_META_DESC": "KoalaSync と Kosmi の正直な比較。 Kosmi の拡張機能なしセットアップが便利な理由と、KoalaSync のネイティブ ビデオ品質が優れている理由をご覧ください。",
"ALT_KOSMI_INTRO": "KoalaSync と Kosmi はどちらも、Netflix、YouTube、その他のプラットフォームを友達と同期して視聴するための優れた方法を提供します。ただし、それらの基盤となるテクノロジーは根本的に異なります。 Kosmi は、拡張機能をインストールせずに Web ブラウザーで直接実行される仮想クラウド ブラウザーを使用します。 KoalaSync は、ローカル ビデオ プレーヤーを同期する軽量の拡張機能です。どのアプローチが最適であるかは、ビデオの品質、利便性、プライバシーに関する優先順位によって異なります。",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Kosmi がより良い選択である場合",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi は、<strong>何もインストールしたくない</strong>場合、またはタブレットやスマートフォンなどのデバイスで視聴したい場合に無敵です。 Kosmi はクラウド上で仮想ブラウザを実行するため、参加するために必要なのは単純な Web リンクだけです。さらに、Kosmi はオールインワンのハングアウト プラットフォームです。同期ストリーミングに加えて、マルチプレイヤー ゲーム (レトロな NES/SNES クラシックやポーカーなど) をプレイしたり、内蔵 Web カメラ、音声、テキスト チャットを使用したりできます。セットアップなしでソーシャル ゲーム ナイやウォッチ パーティーを開きたい場合は、Kosmi が素晴らしいソリューションです。",
"ALT_KOSMI_WHEN_KOALA_TITLE": "KoalaSync がより適切にフィットすると",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync は<strong>ネイティブ再生の品質、セキュリティ、 パフォーマンス</strong>という点で優れています。<br><br>• <strong>セキュリティ リスクなし</strong>: Kosmi を使用すると、クラウド内のリモート仮想コンピュータで Netflix または Prime アカウントにログインする必要があります。 KoalaSync を使用すると、通常と同じように、自分のブラウザで公式ストリーミング Web サイトに安全にログインできます。パスワードがマシンから流出することはありません。<br>• <strong>フル ビデオ品質 (4K/HDR)</strong>: Kosmi は仮想ブラウザの画面を圧縮ビデオ フィードとしてストリーミングするため、ピクセルやバッファリングが発生する可能性があります。 KoalaSync はネイティブ プレーヤーをローカルに同期します。サブスクリプションの鮮明なフル解像度で映画をお楽しみいただけます。<br>• <strong>遅延がなく、帯域幅に優しい</strong>: KoalaSync は制御コマンド (再生/一時停止/タイムスタンプ) のみを送信するため、帯域幅の使用はほぼゼロです。 Kosmi は常に HD ビデオ フィードをストリーミングするため、低速接続では圧倒される可能性があります。<br>• <strong>ローカル ビデオ ファイル</strong>: プライベート ビデオを見たい場合は、MP4 ファイルをブラウザ タブにドラッグ アンド ドロップして同期するだけです。 Kosmi はローカル ハード ドライブ上のファイルにアクセスできません。",
"ALT_KOSMI_MAIN_DIFF_TITLE": "主な違い",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi はリモートブラウザの画面をストリーミングする<strong>仮想クラウドハングアウト</strong>であるため、拡張機能をインストールする必要はありません。 KoalaSync は、 公式ストリーミング Web サイトのネイティブ プレーヤーに直接接続する<strong>ローカル ブラウザ同期レイヤー</strong>です。 Kosmi はミニゲームやデバイスの互換性に関してより多用途ですが、KoalaSync は元のプレーヤーでより安全で、滑らかで、鮮明なストリーミング エクスペリエンスを提供します。",
"ALT_KOSMI_LIMITS_TITLE": "正直な限界",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync は<strong>ブラウザ拡張機能をインストールする必要</strong>があり、現時点ではデスクトップ PC でのみ動作します。とにかくすでにDiscordや他の音声ツールを介して話しているという前提に基づいて設計されているため、<strong>チャットやウェブカメラは組み込まれていません</strong>。また、内蔵ゲームも提供していません。",
"ALT_KOSMI_SUMMARY_TITLE": "要するに",
"ALT_KOSMI_SUMMARY_BODY": "レトロなクラシックを楽しみながら、インストールせずにモバイルデバイスで簡単にアクセスできるカジュアルなゲームナイトには、Kosmi が最適です。最大限のセキュリティと最小限の帯域幅への影響で、Netflix、Prime Video、Disney+、または Plex でフル 4K 品質のプレミアム映画ナイトを視聴するには、KoalaSync が明らかに勝者です。",
"ALT_TWOSEVEN_TITLE": "KoalaSync と TwoSeven: どちらのウォッチ パーティー ソリューションがより適していますか?",
"ALT_TWOSEVEN_META_DESC": "KoalaSync と TwoSeven の正直な比較。 TwoSeven の内蔵 Web カメラがどのような場合に最適なのか、そして KoalaSync が Disney+ と Netflix に最適である理由をご確認ください。",
"ALT_TWOSEVEN_INTRO": "KoalaSync と TwoSeven は両方とも、ウォッチ パーティーに対して同じ基本的なアプローチを使用します。つまり、クラウドから圧縮されたビデオ フィードをストリーミングするのではなく、ブラウザーでオリジナルのビデオ プレーヤーを直接同期します。これにより、両方のツールで最高レベルのビデオ品質が保証されます。ただし、TwoSeven は Web カメラ チャットとサブスクリプション層が組み込まれた商用ポータルですが、KoalaSync は依然としてミニマリストで完全に無料でプライバシーに配慮した拡張機能です。ここであなたに最適なサービスを見つけてください。",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "TwoSeven がより良い選択である場合",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "ブラウザに直接統合されたウェブカメラと音声チャット</strong>を備えた<strong>オールインワン ソリューションが必要な場合は、TwoSeven が正しい選択です。バックグラウンドで Discord や Teamspeak を実行せずに視聴中に友達を見たい場合は、TwoSeven がこの統合をネイティブに提供します。さらに、YouTube および拡張機能なしのいくつかのオープン Web ビデオ プレーヤーでも機能します。視聴中に視覚的なつながりを共有したい 2 ~ 3 人の小グループに適しています。",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "KoalaSync がより適切にフィットすると",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync は<strong>手数料、プライバシー、 シンプルさの完全な欠如</strong>で優れています:<br><br>• <strong>ペイウォールなし</strong>: Disney+ や Hulu などのプレミアム サービスを TwoSeven で同期して視聴するには、少なくとも 1 人のルーム メンバーが Patreon でサービスをサポートする必要があります (月額 3 ドルから)。 KoalaSync は、Netflix、Prime Video、Disney+、自己ホスト型メディア サーバー (Jellyfin、Plex、Emby) を 100% 無料で制限なしで同期します。<br>• <strong>絶対プライバシー (トラッカー/広告なし)</strong>: TwoSeven は広告でサポートされており、Google、Facebook などの複数のトラッカーを使用しています。 KoalaSync には広告やトラッカーがなく、RAM のみのリレー サーバーとのみ通信します。<br>• <strong>登録は不要</strong>: TwoSeven では、すべての参加者がアカウントを作成してログインする必要があります。KoalaSync は完全にアカウント不要です。インストールしてルームコードを入力するだけで、視聴を開始できます。<br>• <strong>軽量でリソースに優しい</strong>: TwoSeven の統合されたウェブカメラとオーディオ フィードは、CPU とネットワークに大きな負荷をかけます。 Discord などのツールに通信を任せることで、KoalaSync は非常にスムーズに動作し、バッテリー寿命を節約できます。",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "主な違い",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven は、登録要件、広告、ピアツーピア Web カメラ チャット、および特定のストリーミング サービス用の Patreon ペイウォールを備えた<strong>商用プラットフォーム</strong>です。 KoalaSync は<strong>無料のオープンソース ユーティリティ</strong>で、アカウントやトラッカー、追加費用なしでブラウザのタブに直接接続できるため、ネイティブ プレーヤーで気を散らすことなく視聴できます。",
"ALT_TWOSEVEN_LIMITS_TITLE": "正直な限界",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync は<strong>内蔵ウェブカメラや音声チャットを提供していません</strong>ので、Discord または同様のツールを介してすでに通話中であることを前提としています。さらに、KoalaSync にはチャット ボックス オーバーレイが組み込まれておらず、現時点ではデスクトップのみです。",
"ALT_TWOSEVEN_SUMMARY_TITLE": "要するに",
"ALT_TWOSEVEN_SUMMARY_BODY": "ブラウザのウェブカメラを介して直接お互いに会いたい、Disney+ サポートのために Patreon をサポートすることを気にしない 2 人または 3 人の小グループにとって、TwoSeven は良い選択肢です。登録なしで広告なし、完全無料、ネイティブ 4K 品質 (Netflix、Prime Video、Disney+、Jellyfin のいずれでも) でプライベートな映画鑑賞をするには、KoalaSync がよりクリーンで安全な選択肢です。",
"ALT_TRY_KOALASYNC": "KoalaSyncを試す",
"MOCK_HOST_CONTROL_LABEL": "ホスト操作",
"MOCK_HOST_CONTROL_TOGGLE": "自分だけが再生を操作できる",
"LABEL_SELECT_VIDEO": "ビデオを選択",
"OPTION_SELECT_TAB": "-- タブを選択してください --",
"THEME_TOGGLE_LABEL": "ライト/ダークモード切り替え",
"FAQ_SHOW_ALL": "すべての質問を表示",
"FAQ_HIDE_ALL": "質問を隠す",
"SELF_SHOW_SETUP": "セットアップガイドを表示",
"SELF_HIDE_SETUP": "ガイドを隠す",
"HERO_TRUST": "無料 · オープンソース · アカウント不要",
"COMP_MORE_GUIDES": "詳しい比較とその他の選択肢"
}
+107 -27
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "ko_KR",
"META_TITLE": "KoalaSync | Netflix, YouTube 및 모든 비디오를 친구와 실시간 동기화 시청",
"META_DESCRIPTION": "Netflix, YouTube, Twitch 및 모든 HTML5 비디오를 친구들과 완벽하게 동기화하여 시청하세요. Chrome 및 Firefox용 무료 오픈 소스 브라우저 확장 프로그램. 가입 필요 없음.",
"SCHEMA_APP_DESC": "Netflix, YouTube, Twitch 및 모든 HTML5 비디오를 친구들과 완벽하게 동기화하여 시청하세요. Chrome 및 Firefox용 무료 오픈 소스 브라우저 확장 프로그램. 가입 필요 없음.",
"OG_TITLE": "KoalaSync | Netflix, Emby, Jellyfin 및 거의 모든 비디오를 친구와 동기화 시청",
"OG_DESCRIPTION": "Netflix, Emby, Jellyfin, YouTube, Twitch 및 거의 모든 HTML5 비디오를 완벽하게 동기화하여 시청하세요. Chrome 및 Firefox용 개인정보 보호 중심 오픈 소스 브라우저 확장 프로그램.",
"TWITTER_TITLE": "KoalaSync | Netflix, Emby, Jellyfin 및 거의 모든 비디오를 친구와 동기화 시청 – 브라우저 확장 프로그램",
"TWITTER_DESCRIPTION": "Netflix, Emby, Jellyfin, YouTube, Twitch 및 거의 모든 HTML5 비디오를 친구들과 완벽하게 동기화하여 시청하세요. Chrome 및 Firefox용 개인정보 보호 중심 오픈 소스 브라우저 확장 프로그램.",
"META_TITLE": "KoalaSync | 넷플릭스·유튜브 워치 파티 확장 프로그램",
"META_DESCRIPTION": "넷플릭스, 유튜브, 트위치 등 모든 HTML5 영상에서 워치 파티. 크롬·파이어폭스용 무료 오픈소스 확장 프로그램. 계정 없음, 추적 없음, 광고 없음.",
"SCHEMA_APP_DESC": "넷플릭스, 유튜브, 트위치 등 모든 HTML5 영상에서 워치 파티. 크롬·파이어폭스용 무료 오픈소스 확장 프로그램. 계정 없음, 추적 없음, 광고 없음.",
"OG_TITLE": "KoalaSync | Netflix, Emby, Jellyfin 및 거의 모든 영상 워치 파티",
"OG_DESCRIPTION": "Netflix, Emby, Jellyfin, YouTube, Twitch 및 거의 모든 HTML5 영상에서 워치 파티를 열어보세요. 오픈소스, 개인정보 보호 중심, 계정 불필요.",
"TWITTER_TITLE": "KoalaSync | Netflix, Emby, Jellyfin 및 거의 모든 영상 워치 파티 – 브라우저 확장 프로그램",
"TWITTER_DESCRIPTION": "Netflix, Emby, Jellyfin, YouTube, Twitch 및 거의 모든 HTML5 영상에서 워치 파티를 열어보세요. 오픈소스, 개인정보 보호 중심, 계정 불필요.",
"NAV_FEATURES": "특징",
"NAV_HOW_IT_WORKS": "작동 방식",
"HERO_TITLE": "함께 시청하세요.<span class='hero-line2'>완벽하게 동기화됩니다.</span>",
"HERO_SUBTITLE": "지연 없는 원격 영화의 밤. 회원가입도, 데이터 수집도 없습니다. 링크 공유하고 함께 시청하세요.",
"HERO_TITLE": "어떤 영상이든 <span class='hero-highlight'>워치 파티</span>로.",
"HERO_SUBTITLE": "지연 없는 원격 영화의 밤. 계정 없음, 추적 없음, 광고 없음. 링크 공유하고 함께 재생하세요.",
"HERO_MASCOT_ALT": "다운로드 버튼을 내려다보고 서 있는 귀여운 코알라",
"DEMO_SYNC": "동기화됨",
"DEMO_HINT": "라이브 데모: 아무 탭에서나 재생을 누르면 KoalaSync가 두 탭을 동기화합니다.",
"DEMO_NO_ROOM": "아직 연결되지 않음",
"DEMO_CREATE_ROOM": "방 만들기",
"DEMO_JOINED": "방 참여됨",
"DEMO_TAB_SELECTED": "탭 선택됨",
"DEMO_SELECT_PLACEHOLDER": "동영상 탭 선택…",
"MOBILE_DEMO_CTA": "작동 방식 보기",
"MOBILE_DEMO_TITLE": "KoalaSync 라이브 데모",
"MOBILE_DEMO_CLOSE": "데모 닫기",
"ADD_TO_CHROME": "Chrome에 추가",
"ADD_TO_FIREFOX": "Firefox에 추가",
"COMPAT_HEADING": "가장 좋아하는 플랫폼에서 작동합니다",
@@ -35,20 +45,20 @@
"USE_CASE_3_DESC": "거리의 한계를 넘어 데이트를 즐겨보세요. 모든 줄거리의 반전을 경험하고, 같은 농담에 웃으며, 감동적인 순간을 정확히 같은 밀리초에 공유하세요.",
"WHY_TITLE": "왜 KoalaSync인가요?",
"WHY_SUBTITLE": "신뢰할 수 있는 동기화, 개인정보 보호 중심 설계, 쉬운 설정을 위해 구축되었습니다.",
"FEATURE_1_TITLE": "완벽한 제어 / 즉시 동기화",
"FEATURE_1_DESC": "한 명이 일시정지하면 모두가 일시정지됩니다. 한 명이 탐색하면 모두가 따라갑니다. 당사의 2단계 동기화 프로토콜은 실시간으로 모든 참여자의 비디오 재생을 조율합니다.",
"FEATURE_1_TITLE": "방장 제어 동기화",
"FEATURE_1_DESC": "누가 재생을 제어할지 직접 결정하세요. 호스트 제어를 활성화하여 자신만 일시중지 및 탐색을 수행하거나 공동 호스트를 지정합니다.",
"FEATURE_2_TITLE": "끊임없는 몰아보기",
"FEATURE_2_DESC": "동기화된 자동 재생. KoalaSync는 에피소드 전환을 자동으로 감지하고 모든 참여자가 다음 비디오를 로드할 때까지 재생을 대기시킵니다.",
"FEATURE_3_TITLE": "계정 없음 / 완전한 개인정보 보호",
"FEATURE_3_DESC": "회원가입 없음, 추적 없음, 흔적을 남기지 않습니다. 서버는 휘발성 RAM에서만 완전히 실행되며 방을 나가면 영구히 삭제됩니다.",
"FEATURE_4_TITLE": "범용 HTML5 지원",
"FEATURE_4_DESC": "YouTube, Twitch, Netflix, Jellyfin, Emby HTML5 비디오 요소가 포함된 거의 모든 페이지에서 작동합니다. 사용자 정의 자체 호스팅 설정과도 호환됩니다. 비디오 데이터는 당사 서버로 절대 전송되지 않으며, 동기화 메타데이터만 전송됩니다.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby HTML5 영상이 있는 거의 모든 페이지에서 작동합니다. 브라우저를 떠나는 것은 동기화 신호뿐, 영상은 아닙니다.",
"FEATURE_5_TITLE": "자체 호스팅 가능 및 Docker 지원",
"FEATURE_5_DESC": "공식 서버는 무료이며 빠르지만, 원하는 경우 직접 호스팅할 수도 있습니다. Docker를 통해 몇 초 만에 나만의 개인 릴레이 서버를 구축해 보세요.",
"FEATURE_6_TITLE": "즉시 초대 / 클릭 한 번으로 참여",
"FEATURE_6_DESC": "IP 주소나 비밀번호를 교환할 필요가 없습니다. 생성된 초대 링크를 친구들과 공유하면 클릭 한 번으로 방에 자동으로 참여할 수 있습니다.",
"FEATURE_7_TITLE": "볼륨 레벨링 / 오디오 압축기",
"FEATURE_7_DESC": "더 이상 볼륨 노브를 계속 조정하지 마세요. 내장 오디오 압축기가 조용한 대증폭하고 큰 폭발음을 완화합니다. Netflix, Prime Video, Disney+, YouTube 및 모든 HTML5 비디오에서 작동합니다. 완전히 로컬에서 처리 — 오디오 데이터가 컴퓨터를 떠나지 않습니다.",
"FEATURE_7_DESC": "더 이상 볼륨을 조절할 필요 없습니다. 내장 압축기가 조용한 대키우고 큰 폭발음을 완화하며, 모든 처리는 브라우저에서 로컬로 이루어집니다.",
"FEATURE_8_TITLE": "오픈 소스 (MIT 라이선스)",
"FEATURE_8_DESC": "모든 코드베이스는 GitHub에서 공개적으로 검토할 수 있습니다. 블랙박스나 독점적인 블롭(blob)이 전혀 없으며, 릴레이 서버부터 브라우저 확장 프로그램까지 100% 투명성을 보장합니다.",
"COMP_TITLE": "KoalaSync 대 Teleparty",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Teleparty 개인정보 처리방침 및 추적 데이터 수집 정보:",
"COMP_FOOTNOTE_4": "표준 HTML5 비디오 태그에 스크립트 삽입을 허용하는 웹사이트에서 작동합니다. 콘텐츠 보안 정책(CSP)이 매우 엄격하거나, DRM 복사 방지가 적용되었거나, 플레이어 래퍼가 복잡하게 난독화된 웹사이트(예: 복잡한 섀도 DOM)에서는 자동 제어 또는 스크립트 삽입이 제한될 수 있습니다.",
"STEPS_TITLE": "시작하기",
"STEP_1_TITLE": "확장 프로그램 설치",
"STEP_1_DESC": "Chrome 웹 스토어, Firefox 부가 기능에서 KoalaSync를 브라우저에 추가하거나, GitHub에서 최신 개발자용 ZIP 파일을 다운로드하세요.",
"STEP_1_ILLUS_DESC": "개인정보 보호 중심의 비디오 동기화 프로그램",
"STEP_1_ILLUS_DL_CHROME": "Chrome용 다운로드",
"STEP_1_ILLUS_DL_FIREFOX": "Firefox용 다운로드",
"STEP_1_ILLUS_ACTIVE": "확장 프로그램 활성화됨",
"STEP_1_ILLUS_READY": "함께 시청 준비가 되었습니다!",
"STEP_2_TITLE": "방 만들기",
"STEP_2_DESC": "확장 프로그램 팝업을 열고 '+ 새 방 만들기'를 클릭하세요. KoalaSync가 안전한 방 ID와 비밀번호를 자동으로 생성하고, 참여한 후 초대 링크를 클립보드에 복사합니다.",
"STEP_1_TITLE": "방 만들기 및 공유",
"STEP_1_DESC": "확장 프로그램을 열고 클릭 한 번으로 방을 만든 후 링크를 공유하세요. 친구들이 초대 링크를 통해 바로 참여합니다.",
"STEP_1_ILLUS_DESC": "연결할 탭 선택",
"STEP_1_ILLUS_DL_CHROME": "YouTube 탭 연결",
"STEP_1_ILLUS_DL_FIREFOX": "Netflix 탭 연결",
"STEP_1_ILLUS_ACTIVE": "탭 연결됨",
"STEP_1_ILLUS_READY": "동기화 시청 준비 완료 !",
"STEP_2_TITLE": "동영상 탭 선택",
"STEP_2_DESC": "동영상이 열려 있는 탭으로 이동하여 확장 프로그램 메뉴에서 해당 탭을 선택하세요. KoalaSync가 플레이어를 자동으로 연결합니다.",
"STEP_2_ILLUS_ROOM": "방",
"STEP_2_ILLUS_SYNC": "동기화",
"STEP_2_ILLUS_SETTINGS": "설정",
"STEP_2_ILLUS_CREATE": "+ 새 방 만들기",
"STEP_2_ILLUS_MANUAL": "수동 연결 / 고급",
"STEP_2_ILLUS_COPIED": "초대 링크가 복사되었습니다!",
"STEP_3_TITLE": "공유 및 동기화",
"STEP_3_DESC": "친구들에게 초대 링크를 보내세요. 친구들이 참여하면 비디오 탭을 선택하고 동기화된 재생을 즐기세요.",
"STEP_3_TITLE": "동기화 즐기기",
"STEP_3_DESC": "재생을 누르세요. 누군가 일시중지, 탐색 또는 재생을 하더라도 모든 사람의 영상이 지연 없이 실시간으로 동기화됩니다.",
"STEP_3_ILLUS_IN_SYNC": "동기화됨",
"SELF_TITLE": "자체 호스팅 사용자를 위한 안내",
"SELF_SUBTITLE": "공식 서버를 신뢰하기 어려우신가요? 완벽한 데이터 주권을 유지하세요. 몇 분 만에 나만의 개인 릴레이 서버를 구축할 수 있습니다.",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SYNC",
"MOCK_14": "다른 사람에게 이동",
"MOCK_15": "최근 활동 상태",
"MOCK_16": "참여자 1명 (KoalaPC) 대기 중...",
"MOCK_16": "참여자 1명 (🐶 HappyDog) 대기 중...",
"MOCK_17": "건너뛰고 재생",
"MOCK_18": "사용자 이름",
"MOCK_19": "복잡한 탭 숨기기",
@@ -179,7 +189,14 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync는 Netflix, Disney+, Amazon, YouTube, Twitch 또는 기타 스트리밍 플랫폼과 제휴, 보증 또는 연관되어 있지 않습니다. 모든 상표는 해당 소유자의 재산입니다.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_TELEPARTY_TITLE": "KoalaSync 대 Teleparty: 어떤 '워치 파티(watch party)' 도구를 선택해야 할까요?",
"ALT_INDEX_TITLE": "KoalaSync - 대안 및 비교",
"ALT_INDEX_META_DESC": "KoalaSync와 다른 워치 파티 확장 프로그램 및 스트리밍 솔루션을 솔직한 비교와 자세한 가이드로 살펴보세요.",
"ALT_INDEX_HEADING": "가이드 및 비교",
"ALT_INDEX_INTRO": "KoalaSync는 다른 워치 파티 도구와 스트리밍 솔루션에 비해 어떤가요? 원격 영화 감상에 가장 잘 맞는 선택지를 찾을 수 있도록 솔직하고 기술적인 비교를 읽어보세요.",
"ALT_INDEX_READ_COMPARISON": "비교 읽기 →",
"ALT_INDEX_READ_GUIDE": "가이드 읽기 →",
"ALT_INDEX_FOOTER_LINK": "가이드 및 비교",
"ALT_TELEPARTY_TITLE": "KoalaSync 대 Teleparty: 어떤 '워치 파티(watch party)' 도구를 선택해야 할까요?",
"ALT_TELEPARTY_META_DESC": "워치 파티를 위한 KoalaSync와 Teleparty의 실용적 비교: 내장 채팅, 모바일 지원, 브라우저 영상 동기화, 자체 호스팅 미디어 서버 및 오픈 소스 활용 여부 등을 다룹니다.",
"ALT_TELEPARTY_INTRO": "KoalaSync와 Teleparty는 모두 '3, 2, 1, 재생' 같은 번거로운 절차 없이 함께 영상을 시청할 수 있게 해준다는 점에서 같은 문제를 해결해 줍니다. 다만 접근 방식에는 차이가 있습니다.<br><br>내장 채팅 기능이 필요하거나 모바일에서 시청하고 싶다면 Teleparty가 가장 합리적인 선택입니다. 반면 KoalaSync는 Discord, Teamspeak 또는 기타 음성 통화 서비스를 통해 이미 대화를 나누고 있으면서, 단순히 영상 재생만 동기화하고 싶은 데스크톱 브라우저 기반의 워치 파티에 더 적합합니다.<br><br>제가 KoalaSync를 개발한 주된 이유는 유연성 때문입니다. 특정 플랫폼 목록에만 국한되지 않고, 일반적인 브라우저 비디오 플레이어를 사용하는 거의 모든 웹사이트에서 작동하도록 설계되었습니다. 여기에는 Emby, Jellyfin, Plex와 같은 자체 호스팅 환경, 로컬/비공개 도메인, 그리고 브라우저상의 수많은 일반 동영상 페이지가 포함됩니다.",
"ALT_TELEPARTY_WHEN_TELE_TITLE": "Teleparty가 여전히 좋은 선택이 될 수 있는 경우",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSync는 음성 통화를 대체하는 서비스가 아닙니다. 영상을 보면서 대화하고 싶다면 평소처럼 Discord, Teamspeak, Signal, WhatsApp 등을 그대로 사용하면 됩니다.<br><br>또한 모든 참가자가 각자의 기기에서 해당 영상이나 페이지에 접속할 수 있어야 합니다. KoalaSync는 구독, 로그인, DRM, 지역 제한 또는 플랫폼 규정을 우회하지 않습니다.<br><br>현재 데스크톱 브라우저에서만 지원되며, 자체 채팅이나 음성 기능은 없습니다. 호환성은 항상 브라우저 및 동영상 플레이어의 영향을 받습니다.",
"ALT_SCREEN_SUMMARY_TITLE": "요약",
"ALT_SCREEN_SUMMARY_BODY": "화질, 개인정보 보호, 개별 제어 기능 등을 크게 신경 쓰지 않고 간편하게 진행하고 싶을 때는 화면 공유가 가장 간단한 방법입니다. 반면, 모든 참가자가 각자의 브라우저에서 직접 영상을 시청하며 실제로 함께 보는 듯한 느낌을 원한다면 KoalaSync가 더 적합합니다.",
"ALT_TRY_KOALASYNC": "KoalaSync 사용해 보기"
"ALT_W2G_TITLE": "KoalaSync 대 Watch2Gether: 어떤 시계 파티 솔루션이 더 적합합니까?",
"ALT_W2G_META_DESC": "KoalaSync와 Watch2Gether의 솔직한 비교입니다. KoalaSync의 유연성이 탁월한 이유와 Watch2Gether가 여전히 YouTube에서 최고의 선택인 이유를 알아보세요.",
"ALT_W2G_INTRO": "KoalaSync와 Watch2Gether는 모두 동일한 문제를 해결합니다. 수동으로 조정하지 않고도 온라인으로 친구들과 동기화된 비디오를 볼 수 있습니다. Watch2Gether는 공유 영화의 밤을 위한 가장 오래되고 가장 인기 있는 허브 중 하나이지만 KoalaSync는 완전히 다른 가벼운 접근 방식을 취합니다. 귀하에게 적합한 도구는 무엇을, 어디서 보고 싶은지에 따라 크게 달라집니다.",
"ALT_W2G_WHEN_W2G_TITLE": "Watch2Gether가 더 나은 선택인 경우",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether는 <strong>YouTube 시청 파티</strong>에서 최고의 앱입니다. 내장된 재생 목록 및 검색 기능을 통해 회의실에 있는 누구나 쉽게 새 비디오를 찾고, 추가하고, 재생할 수 있습니다. 모두가 함께 원활하게 다음 동영상을 시청합니다.<br><br>YouTube의 KoalaSync를 사용하면 사이트의 기본 자동 재생이 대신되어 각 사용자를 다른 추천 동영상으로 리디렉션합니다. Netflix 또는 Disney+에서 잘 작동하는 자동 다음 에피소드 기능('에피소드 로비')은 이러한 동적 추천으로 인해 YouTube에서는 작동하지 않습니다. 순수한 YouTube 밤에는 Watch2Gether가 더 나은 선택입니다.",
"ALT_W2G_WHEN_KOALA_TITLE": "KoalaSync가 더 잘 맞을 때",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync는 <strong>실제 스트리밍 서비스</strong>(Netflix, Prime Video, Disney+) 및 자체 호스팅 미디어 서버(Jellyfin, Plex, Emby)에서 빛을 발합니다. 프리미엄 콘텐츠를 전혀 재생할 수 없는 Watch2Gether와 달리 KoalaSync는 웹사이트에서 직접 기본 플레이어를 동기화합니다.<br><br>표준 HTML5 비디오 플레이어가 있는 거의 모든 사이트에서 작동합니다. 타사 사이트에 가상 방을 설정할 필요가 없습니다. 확장 프로그램을 활성화하고 로비에 참여하고 시청을 시작하기만 하면 됩니다.",
"ALT_W2G_MAIN_DIFF_TITLE": "주요 차이점",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether는 채팅, 재생목록, 웹캠 지원 기능이 내장된 <strong>독립형 웹사이트</strong>입니다. KoalaSync는 일반 브라우저 탭에 직접 연결되는 <strong>미니멀리스트 브라우저 확장 프로그램</strong>입니다.<br><br>채팅 기능이 내장된 YouTube용 올인원 패키지를 찾고 계십니까? Watch2Gether를 사용하세요. 방해받지 않고 기본 품질(서버 압축 없음)로 Netflix 또는 자체 서버에서 영화를 시청하고 싶으십니까? KoalaSync는 더욱 깨끗한 솔루션입니다.",
"ALT_W2G_LIMITS_TITLE": "정직한 제한",
"ALT_W2G_LIMITS_BODY": "KoalaSync에는 <strong>재생목록이나 동영상 검색 기능이 내장되어 있지 않습니다</strong>. YouTube에서 이는 다음 동영상의 자동 재생이 동기화되지 않음을 의미합니다.<br><br>또한 <strong>내장된 채팅이 없으며</strong> KoalaSync는 현재 데스크톱 브라우저에서만 작동합니다. 어쨌든 Discord, Teamspeak 또는 기타 음성 도구를 통해 이미 대화하고 있다는 가정하에 설계되었습니다.",
"ALT_W2G_SUMMARY_TITLE": "요컨대",
"ALT_W2G_SUMMARY_BODY": "재생 목록과 내장된 채팅이 포함된 즉석 YouTube 세션의 경우 Watch2Gether가 최선의 선택입니다. 프리미엄 스트리밍 플랫폼(예: Netflix, Prime Video, Disney+), 자체 호스팅 서버(Jellyfin, Plex, Emby) 및 최대 브라우저 유연성의 경우 KoalaSync가 더 적합하고 가벼운 도구입니다.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener: 어떤 시계 파티 플랫폼이 더 잘 맞나요?",
"ALT_SCENER_META_DESC": "KoalaSync와 Scener를 정직하게 비교합니다. Scener의 웹캠 채팅이 언제 승리하는지, 왜 KoalaSync가 방해 없는 영화 감상에 가장 적합한지 알아보세요.",
"ALT_SCENER_INTRO": "KoalaSync와 Scener는 완전히 다른 두 가지 각도에서 시계 파티에 접근합니다. Scener는 영상 채팅과 대화형 룸이 내장된 가상 영화관입니다. 반면에 KoalaSync는 재생 컨트롤을 간단히 동기화하는 미니멀하고 개인 정보 보호 친화적인 브라우저 확장 프로그램입니다. 귀하에게 가장 적합한 도구는 기본적으로 내장된 웹캠과 채팅 기능이 귀하에게 얼마나 중요한지에 따라 달라집니다.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Scener가 더 나은 선택일 때",
"ALT_SCENER_WHEN_SCENER_BODY": "브라우저에 직접 영상 및 음성 채팅이 내장된 <strong>올인원 소셜 플랫폼</strong>을 원하는 경우 Scener는 확실한 선택입니다. Scener는 플레이어와 친구의 웹캠이 나란히 표시되는 가상 공간을 만듭니다. 이는 사회적 측면이 최우선인 대규모 공개 시청 파티 또는 가상 스트리밍 이벤트에 이상적입니다. 그러나 무료 기본 버전은 광고가 지원되며 Scener는 월간 구독($5.79/월 또는 $39.99/년) 뒤에 많은 기능(예: 광고 없는 시청 및 무제한 화상 채팅)을 고정한다는 점을 명심하세요.",
"ALT_SCENER_WHEN_KOALA_TITLE": "KoalaSync가 더 잘 맞을 때",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync는 <strong>동영상 품질, 개인 정보 보호 및 단순성</strong> 면에서 빛을 발합니다.<br><br>• <strong>계정 없음</strong>: 등록, 로그인 또는 프로필 관리가 필요하지 않습니다. 확장 프로그램을 활성화하고 방 코드를 공유하고 시청을 시작하세요.<br>• <strong>진정한 기본 품질(4K/HDR)</strong>: Scener는 가상 클라우드 서버에서 압축된 비디오를 스트리밍하므로 품질 손실과 지연이 발생할 수 있습니다. KoalaSync는 컴퓨터에서 기본 플레이어를 직접 동기화합니다. 즉, 스트리밍 구독의 전체 해상도로 영화를 감상할 수 있습니다.<br>• <strong>은 대역폭 사용량</strong>: 제어 데이터(재생, 일시중지, 타임스탬프)만 전송되므로 KoalaSync는 사실상 추가 대역폭을 사용하지 않습니다. Scener는 클라우드 서버를 통해 전체 동영상과 카메라 피드를 스트리밍하므로 느린 인터넷 연결과 구형 노트북에 큰 부담을 줄 수 있습니다.<br>• <strong>100% 무료이고 광고가 없습니다</strong>: 월간 구독료가 없고, 광고가 없으며, 추적기도 없습니다.<br>• <strong>로컬 동영상 파일</strong>: KoalaSync는 로컬에서 실행되므로 친구와 동기화하여 자신의 동영상 파일(예: MP4)을 볼 수도 있습니다. 파일을 브라우저 탭으로 끌어다 놓기만 하면 됩니다. Scener는 플레이어가 클라우드에서 실행되기 때문에 이 작업을 수행할 수 없습니다.",
"ALT_SCENER_MAIN_DIFF_TITLE": "주요 차이점",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener는 가상 클라우드 브라우저로 구동되고 광고와 월간 구독을 통해 자금을 조달하는 시청 파티를 위한 <strong>상업적 소셜 네트워크</strong>입니다. KoalaSync는 브라우저 탭에 직접 연결되는 <strong>개인 정보 보호를 최우선으로 하는 무료 동기화 유틸리티</strong>입니다. 음성/영상 채팅은 Discord 또는 Teamspeak와 같은 애플리케이션에 맡기고 재생을 유연하고 비공개이며 기본 원본 품질로 유지하는 데 전적으로 중점을 둡니다.",
"ALT_SCENER_LIMITS_TITLE": "정직한 제한",
"ALT_SCENER_LIMITS_BODY": "KoalaSync는 <strong>채팅이나 웹캠 지원 기능이 내장되어 있지 않습니다</strong>. 이는 순전히 동기화 도구이며 선택한 별도의 음성 통화 도구가 필요합니다. 또한 KoalaSync는 현재 데스크톱 전용이며 로컬 비디오 파일 호환성은 브라우저가 기본적으로 비디오 형식 및 오디오 코덱 재생을 지원하는지 여부에 따라 전적으로 달라집니다.",
"ALT_SCENER_SUMMARY_TITLE": "요컨대",
"ALT_SCENER_SUMMARY_BODY": "웹캠 채팅과 소셜 기능이 내장된 대규모 시청 파티의 경우 광고와 프리미엄 페이월에 신경 쓰지 않는다면 Scener가 올바른 선택입니다. 기본 플레이어(Netflix, Prime Video, Disney+ 또는 로컬 브라우저 파일 포함)에서 완전히 무료이고, 광고가 없고, 방해 없는 경험을 원하고 이미 음성 통화 중이라면 KoalaSync가 더 깔끔하고 성능이 뛰어난 솔루션입니다.",
"ALT_KOSMI_TITLE": "KoalaSync vs Kosmi: 어떤 Netflix 파티 대안이 더 잘 맞나요?",
"ALT_KOSMI_META_DESC": "KoalaSync와 Kosmi의 솔직한 비교입니다. Kosmi의 확장 없는 설정이 편리한 이유와 KoalaSync의 기본 비디오 품질이 뛰어난 이유를 알아보세요.",
"ALT_KOSMI_INTRO": "KoalaSync와 Kosmi는 모두 친구들과 동기화하여 Netflix, YouTube 및 기타 플랫폼을 시청할 수 있는 훌륭한 방법을 제공합니다. 그러나 기본 기술은 근본적으로 다릅니다. 코스미는 확장 프로그램 설치 없이 웹 브라우저에서 직접 실행되는 가상 클라우드 브라우저를 사용합니다. KoalaSync는 로컬 비디오 플레이어를 동기화하는 경량 확장 프로그램입니다. 귀하에게 가장 적합한 접근 방식은 비디오 품질, 편의성 및 개인정보 보호에 대한 우선순위에 따라 다릅니다.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "코스미가 더 나은 선택일 때",
"ALT_KOSMI_WHEN_KOSMI_BODY": "<strong>아무 것도 설치하지 않고</strong> 태블릿이나 스마트폰과 같은 기기에서 시청하고 싶다면 Kosmi는 최고의 앱입니다. 코스미는 클라우드에서 가상 브라우저를 실행하기 때문에 간단한 웹 링크만 있으면 가입할 수 있습니다. 또한 Kosmi는 올인원 행아웃 플랫폼입니다. 동기화된 스트리밍 외에도 멀티플레이어 게임(예: 레트로 NES/SNES 클래식 또는 포커)을 플레이하고 내장 웹캠, 음성 및 문자 채팅을 사용할 수 있습니다. 설정 없이 소셜 게임의 밤과 파티 시청을 원한다면 Kosmi가 환상적인 솔루션입니다.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "KoalaSync가 더 잘 맞을 때",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync는 <strong>기본 재생 품질, 보안 및 성능</strong>에서 빛을 발합니다.<br><br>• <strong>보안 위험 없음</strong>: Kosmi를 사용하면 클라우드의 원격 가상 컴퓨터에서 Netflix 또는 Prime 계정에 로그인해야 합니다. KoalaSync를 사용하면 평소와 마찬가지로 자신의 브라우저에서 공식 스트리밍 웹사이트에 안전하게 로그인할 수 있습니다. 비밀번호는 컴퓨터 외부로 유출되지 않습니다.<br>• <strong>전체 동영상 품질(4K/HDR)</strong>: Kosmi는 가상 브라우저의 화면을 압축된 동영상 피드로 스트리밍하므로 픽셀화 및 버퍼링이 발생할 수 있습니다. KoalaSync는 기본 플레이어를 로컬로 동기화합니다. 구독의 완전하고 선명한 해상도로 영화를 즐길 수 있습니다.<br>• <strong>지연이 없고 대역폭 친화적</strong>: KoalaSync는 제어 명령(재생/일시 중지/타임스탬프)만 보내기 때문에 거의 0의 대역폭을 사용합니다. Kosmi는 지속적으로 HD 동영상 피드를 스트리밍하므로 연결 속도가 느려질 수 있습니다.<br>• <strong>로컬 동영상 파일</strong>: 비공개 동영상을 시청하려면 MP4 파일을 브라우저 탭으로 드래그 앤 드롭하고 동기화하면 됩니다. Kosmi는 로컬 하드 드라이브의 파일에 접근할 수 없습니다.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "주요 차이점",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi는 원격 브라우저의 화면을 스트리밍하는 <strong>가상 클라우드 행아웃</strong>이므로 누구도 확장 프로그램을 설치할 필요가 없습니다. KoalaSync는 공식 스트리밍 웹사이트의 기본 플레이어에 직접 연결되는 <strong>로컬 브라우저 동기화 레이어</strong>입니다. Kosmi는 미니 게임 및 장치 호환성 측면에서 더 다재다능한 반면 KoalaSync는 원래 플레이어에서 더 안전하고 유연하며 선명한 스트리밍 경험을 제공합니다.",
"ALT_KOSMI_LIMITS_TITLE": "정직한 제한",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync는 <strong>브라우저 확장 프로그램을 설치해야 하며</strong> 현재 데스크톱 PC에서만 실행됩니다. 어쨌든 Discord나 다른 음성 도구를 통해 이미 대화하고 있다는 가정하에 설계되었기 때문에 <strong>내장 채팅이나 웹캠이 없습니다</strong>. 또한 내장 게임도 제공하지 않습니다.",
"ALT_KOSMI_SUMMARY_TITLE": "요컨대",
"ALT_KOSMI_SUMMARY_BODY": "설치 없이 모바일 장치에서 쉽게 액세스할 수 있고 레트로 클래식을 즐길 수 있는 캐주얼한 게임 밤에는 Kosmi가 이상적입니다. 최대의 보안과 최소의 대역폭 영향으로 Netflix, Prime Video, Disney+ 또는 Plex에서 풀 4K 품질로 프리미엄 영화를 감상하는 경우 KoalaSync가 확실한 승자입니다.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven: 어떤 시계 파티 솔루션이 더 적합할까요?",
"ALT_TWOSEVEN_META_DESC": "KoalaSync와 TwoSeven의 솔직한 비교입니다. TwoSeven의 내장 웹캠이 성공하는 시기와 KoalaSync가 Disney+ 및 Netflix에 가장 적합한 이유를 알아보세요.",
"ALT_TWOSEVEN_INTRO": "KoalaSync와 TwoSeven은 모두 함께 시청하기 위해 동일한 기본 접근 방식을 사용합니다. 즉, 클라우드에서 압축된 비디오 피드를 스트리밍하는 대신 브라우저에서 직접 원본 비디오 플레이어를 동기화합니다. 이는 두 도구 모두에 대해 최고 수준의 비디오 품질을 보장합니다. 그러나 TwoSeven은 웹캠 채팅 및 구독 계층이 내장된 상업용 포털인 반면 KoalaSync는 최소한의 완전 무료이며 개인 정보 보호 친화적인 확장 기능을 유지합니다. 여기에서 귀하에게 가장 적합한 서비스를 찾아보세요.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "TwoSeven이 더 나은 선택일 때",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "브라우저에서 직접 <strong>웹캠과 오디오 채팅이 통합된 올인원 솔루션</strong>을 원하는 경우 TwoSeven이 올바른 선택입니다. 백그라운드에서 Discord나 Teamspeak를 실행할 필요 없이 시청하는 동안 친구들을 보고 싶다면 TwoSeven이 이 통합 기능을 기본적으로 제공합니다. 또한 확장 기능이 없는 YouTube 및 일부 개방형 웹 비디오 플레이어에서도 작동합니다. 시청하면서 시각적 연결을 공유하려는 2~3명의 소규모 그룹에 적합합니다.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "KoalaSync가 더 잘 맞을 때",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync는 <strong>수수료, 개인 정보 보호 및 단순성이 전혀 없음</strong>으로 빛을 발합니다.<br><br>• <strong>페이월 없음</strong>: TwoSeven에서 Disney+ 또는 Hulu와 같은 프리미엄 서비스를 동기화하려면 최소 한 명의 룸 멤버가 Patreon에서 지원해야 합니다(월 3달러부터 시작). KoalaSync는 Netflix, Prime Video, Disney+ 및 자체 호스팅 미디어 서버(Jellyfin, Plex, Emby)를 제한 없이 100% 무료로 동기화합니다.<br>• <strong>추적기/광고 없음</strong>: TwoSeven은 광고가 지원되며 Google, Facebook 등의 여러 추적기를 사용합니다. KoalaSync에는 광고나 추적기가 없으며 RAM 전용 릴레이 서버와 독점적으로 통신합니다.<br>• <strong>등록이 필요하지 않습니다</strong>: TwoSeven은 모든 참가자에게 계정을 만들고 로그인하도록 요구합니다. KoalaSync는 계정이 전혀 필요하지 않습니다. 설치하고 방 코드를 입력하고 시청을 시작하세요.<br>• <strong>경량 및 리소스 친화적</strong>: TwoSeven의 통합 웹캠과 오디오 피드는 CPU와 네트워크에 큰 부하를 줍니다. Discord와 같은 도구와의 통신을 유지함으로써 KoalaSync는 매우 원활하게 실행되고 배터리 수명을 보존니다.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "주요 차이점",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven은 등록 요구 사항, 광고, P2P 웹캠 채팅, 특정 스트리밍 서비스에 대한 Patreon 페이월을 갖춘 <strong>상업 플랫폼</strong>입니다. KoalaSync는 계정, 추적기 또는 추가 비용 없이 브라우저 탭에 직접 연결되는 <strong>무료 오픈 소스 유틸리티</strong>로, 기본 플레이어에서 방해 없이 시청할 수 있습니다.",
"ALT_TWOSEVEN_LIMITS_TITLE": "정직한 제한",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync는 <strong>내장 웹캠이나 오디오 채팅이 없으며</strong> Discord 또는 유사한 도구를 통해 이미 통화 중이라고 가정합니다. 또한 KoalaSync에는 채팅 상자 오버레이가 내장되어 있지 않으며 현재 데스크톱 전용입니다.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "요컨대",
"ALT_TWOSEVEN_SUMMARY_BODY": "브라우저에서 직접 웹캠을 통해 서로를 보고 싶어하고 Patreon에서 Disney+ 지원을 지원하는 것을 꺼리지 않는 2~3명으로 구성된 소규모 그룹의 경우 TwoSeven이 좋은 옵션입니다. 등록 없이 네이티브 4K 품질(Netflix, Prime Video, Disney+, Jellyfin 등)로 광고 없이 완전 무료로 비공개 영화를 감상하려면 KoalaSync가 더 깨끗하고 안전한 선택입니다.",
"ALT_TRY_KOALASYNC": "KoalaSync 사용해 보기",
"MOCK_HOST_CONTROL_LABEL": "호스트 제어",
"MOCK_HOST_CONTROL_TOGGLE": "나만 재생을 제어할 수 있음",
"LABEL_SELECT_VIDEO": "비디오 선택",
"OPTION_SELECT_TAB": "-- 탭 선택 --",
"THEME_TOGGLE_LABEL": "라이트/다크 모드 전환",
"FAQ_SHOW_ALL": "모든 질문 보기",
"FAQ_HIDE_ALL": "질문 숨기기",
"SELF_SHOW_SETUP": "설치 가이드 보기",
"SELF_HIDE_SETUP": "가이드 숨기기",
"HERO_TRUST": "무료 · 오픈소스 · 계정 불필요",
"COMP_MORE_GUIDES": "전체 비교 및 다른 대안 보기"
}
+112 -32
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "nl_NL",
"META_TITLE": "KoalaSync | Synchroniseer Netflix, YouTube & elke video met vrienden",
"META_DESCRIPTION": "Bekijk Netflix, YouTube, Twitch en elke HTML5-video in perfecte synchronisatie met vrienden. Gratis, open-source browserextensie voor Chrome en Firefox. Geen registratie nodig.",
"SCHEMA_APP_DESC": "Bekijk Netflix, YouTube, Twitch en elke HTML5-video in perfecte synchronisatie met vrienden. Gratis, open-source browserextensie voor Chrome en Firefox. Geen registratie nodig.",
"OG_TITLE": "KoalaSync | Synchroniseer Netflix, Emby, Jellyfin & bijna elke video met vrienden",
"OG_DESCRIPTION": "Bekijk Netflix, Emby, Jellyfin, YouTube, Twitch en bijna elke HTML5-video in perfecte synchronisatie. Privacy-first, open-source browserextensie voor Chrome & Firefox.",
"TWITTER_TITLE": "KoalaSync | Synchroniseer Netflix, Emby, Jellyfin & bijna elke video met vrienden Browserextensie",
"TWITTER_DESCRIPTION": "Bekijk Netflix, Emby, Jellyfin, YouTube, Twitch en bijna elke HTML5-video in perfecte synchronisatie met vrienden. Privacy-first, open-source browserextensie voor Chrome en Firefox.",
"META_TITLE": "KoalaSync | Watch party voor Netflix, YouTube & elke video",
"META_DESCRIPTION": "Watch party op Netflix, YouTube, Twitch en elke HTML5-video. Gratis open-source extensie voor Chrome en Firefox. Geen account, geen tracking, geen reclame.",
"SCHEMA_APP_DESC": "Watch party op Netflix, YouTube, Twitch en elke HTML5-video. Gratis open-source extensie voor Chrome en Firefox. Geen account, geen tracking, geen reclame.",
"OG_TITLE": "KoalaSync | Watch party voor Netflix, Emby, Jellyfin en bijna elke video",
"OG_DESCRIPTION": "Start een watch party op Netflix, Emby, Jellyfin, YouTube, Twitch en bijna elke HTML5-video. Open source, privacyvriendelijk en zonder account.",
"TWITTER_TITLE": "KoalaSync | Watch party voor Netflix, Emby, Jellyfin en bijna elke video Browserextensie",
"TWITTER_DESCRIPTION": "Start een watch party op Netflix, Emby, Jellyfin, YouTube, Twitch en bijna elke HTML5-video. Open source, privacyvriendelijk en zonder account.",
"NAV_FEATURES": "Functies",
"NAV_HOW_IT_WORKS": "Hoe het werkt",
"HERO_TITLE": "Samen Kijken.<span class='hero-line2'>Perfect Synchroniseren.</span>",
"HERO_SUBTITLE": "Uw filmavond op afstand zonder vertraging. Geen registratie, geen gegevensverzameling. Deel gewoon een link en kijk samen.",
"HERO_TITLE": "Maak van elke video een <span class='hero-highlight'>watch party</span>.",
"HERO_SUBTITLE": "Jouw filmavond op afstand, zonder vertraging. Geen account, geen tracking, geen advertenties. Deel een link en druk samen op play.",
"HERO_MASCOT_ALT": "Een schattige koala die staat en naar beneden kijkt naar de downloadknoppen",
"DEMO_SYNC": "Synchroon",
"DEMO_HINT": "Live demo: druk op play in een van de tabbladen en KoalaSync houdt beide synchroon.",
"DEMO_NO_ROOM": "Nog niet verbonden",
"DEMO_CREATE_ROOM": "Kamer aanmaken",
"DEMO_JOINED": "In de kamer",
"DEMO_TAB_SELECTED": "Tabblad geselecteerd",
"DEMO_SELECT_PLACEHOLDER": "Kies een videotabblad…",
"MOBILE_DEMO_CTA": "Bekijk hoe het werkt",
"MOBILE_DEMO_TITLE": "KoalaSync live demo",
"MOBILE_DEMO_CLOSE": "Demo sluiten",
"ADD_TO_CHROME": "Toevoegen aan Chrome",
"ADD_TO_FIREFOX": "Toevoegen aan Firefox",
"COMPAT_HEADING": "Werkt op uw favoriete platforms",
@@ -35,20 +45,20 @@
"USE_CASE_3_DESC": "Overbrug de afstand en geniet van date nights. Ervaar elke plotwending, lach om dezelfde grappen en deel emotionele momenten op exact dezelfde milliseconde.",
"WHY_TITLE": "Waarom KoalaSync?",
"WHY_SUBTITLE": "Gebouwd voor betrouwbare synchronisatie, privacy-first ontwerp en eenvoudige installatie.",
"FEATURE_1_TITLE": "Volledige controle / Directe synchronisatie",
"FEATURE_1_DESC": "Eén pauzeert, iedereen pauzeert. Eén spoelt, iedereen volgt. Ons tweefasige synchronisatieprotocol coördineert het afspelen in realtime voor alle deelnemers.",
"FEATURE_1_TITLE": "Host-controle & synchronisatie",
"FEATURE_1_DESC": "Jij bepaalt wie het afspelen bedient. Schakel hostbeheer in zodat alleen jij kunt pauzeren en spoelen, of wijs co-hosts aan.",
"FEATURE_2_TITLE": "Eindeloos binge-watchen",
"FEATURE_2_DESC": "Automatisch afspelen in sync. KoalaSync detecteert automatisch afleveringsovergangen en houdt het afspelen vast totdat alle deelnemers de volgende video succesvol hebben geladen.",
"FEATURE_3_TITLE": "Geen accounts / Pure privacy",
"FEATURE_3_DESC": "Geen registratie, geen tracking, geen permanente voetafdruk. De server draait volledig in het tijdelijke RAM en wist uw kamer wanneer u vertrekt.",
"FEATURE_4_TITLE": "Universele HTML5-ondersteuning",
"FEATURE_4_DESC": "Werkt op YouTube, Twitch, Netflix, Jellyfin, Emby en bijna elke standaard webpagina met een HTML5-video-element. Ook compatibel met aangepaste zelfgehoste installaties. Er worden nooit videogegevens naar onze servers verzonden — alleen synchronisatiemetagegevens.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby en vrijwel elke pagina met HTML5-video. Alleen sync-signalen verlaten je browser, nooit de video.",
"FEATURE_5_TITLE": "Zelf te hosten & Docker-ready",
"FEATURE_5_DESC": "Onze officiële servers zijn gratis en snel, maar u kunt de volledige controle nemen als u dat wilt. Start uw eigen privé-relayserver in seconden via Docker.",
"FEATURE_6_TITLE": "Directe uitnodigingen / 1-klik deelname",
"FEATURE_6_DESC": "Geen IP-adressen of wachtwoorden om uit te wisselen. Deel een gegenereerde uitnodigingslink met uw vrienden om ze met een enkele klik automatisch deel te laten nemen.",
"FEATURE_7_TITLE": "Volume egaliseren / Audiocompressor",
"FEATURE_7_DESC": "Niet langer aan de volumeknop zitten. De ingebouwde audiocompressor versterkt stille dialogen en dempt harde explosies. Werkt op Netflix, Prime Video, Disney+, YouTube en elke HTML5-video. Volledig lokaal — geen audiogegevens verlaten uw computer.",
"FEATURE_7_DESC": "Nooit meer aan de volumeknop draaien. Een ingebouwde compressor tilt stille dialogen op en temt luide explosies, allemaal lokaal in je browser verwerkt.",
"FEATURE_8_TITLE": "Open Source (MIT License)",
"FEATURE_8_DESC": "De volledige codebase is openbaar controleerbaar op GitHub. Geen zwarte dozen, geen propri?taire blobs - 100% transparantie van de relayserver tot de browserextensie.",
"COMP_TITLE": "KoalaSync vs. Teleparty",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Teleparty privacybeleid en trackinggegevensverzameling:",
"COMP_FOOTNOTE_4": "Werkt op websites die scriptinjecties in standaard HTML5-videotags toestaan. Websites met een zeer strikt Content Security Policy (CSP), DRM-kopieerbeveiliging of sterk versluierde spelers (zoals complexe shadow-DOM's) kunnen automatische controle of injectie beperken.",
"STEPS_TITLE": "Aan de slag",
"STEP_1_TITLE": "Extensie installeren",
"STEP_1_DESC": "Voeg KoalaSync toe aan uw browser vanuit de Chrome Web Store, Firefox-add-ons, of download de nieuwste ontwikkelaars-ZIP van GitHub.",
"STEP_1_ILLUS_DESC": "Privacy-first videosynchronisator",
"STEP_1_ILLUS_DL_CHROME": "Downloaden voor Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Downloaden voor Firefox",
"STEP_1_ILLUS_ACTIVE": "Extensie actief",
"STEP_1_ILLUS_READY": "Klaar om samen te kijken!",
"STEP_2_TITLE": "Kamer maken",
"STEP_2_DESC": "Open de extensie-popup en klik op '+ Nieuwe kamer maken'. KoalaSync genereert automatisch een beveiligde Kamer-ID en Wachtwoord, neemt deel en kopieert de uitnodigingslink naar uw klembord.",
"STEP_1_TITLE": "Kamer maken en delen",
"STEP_1_DESC": "Open de extensie, maak een kamer met één klik en deel de link met je vrienden. Ze nemen direct deel via de uitnodigingslink.",
"STEP_1_ILLUS_DESC": "Kies een tabblad om te koppelen",
"STEP_1_ILLUS_DL_CHROME": "YouTube-tabblad koppelen",
"STEP_1_ILLUS_DL_FIREFOX": "Netflix-tabblad koppelen",
"STEP_1_ILLUS_ACTIVE": "Tabblad gekoppeld",
"STEP_1_ILLUS_READY": "Klaar voor synchroon kijken !",
"STEP_2_TITLE": "Videotabblad selecteren",
"STEP_2_DESC": "Ga naar je videotabblad en selecteer dit in het menu van de extensie. KoalaSync koppelt vanaf nu automatisch jullie spelers.",
"STEP_2_ILLUS_ROOM": "Kamer",
"STEP_2_ILLUS_SYNC": "Sync",
"STEP_2_ILLUS_SETTINGS": "Instellingen",
"STEP_2_ILLUS_CREATE": "+ Nieuwe kamer maken",
"STEP_2_ILLUS_MANUAL": "Handmatig verbinden / Geavanceerd",
"STEP_2_ILLUS_COPIED": "Uitnodigingslink gekopieerd!",
"STEP_3_TITLE": "Delen & Synchroniseren",
"STEP_3_DESC": "Stuur de uitnodigingslink naar uw vrienden. Zodra ze deelnemen, selecteert u uw videotabblad en geniet u van gesynchroniseerd afspelen.",
"STEP_3_TITLE": "Genieten van de synchronisatie",
"STEP_3_DESC": "Druk op afspelen. Of iemand nu pauzeert, spoelt of afspeelt, de video van iedereen blijft perfect en zonder vertraging synchroon.",
"STEP_3_ILLUS_IN_SYNC": "IN SYNC",
"SELF_TITLE": "Voor zelf-hosters",
"SELF_SUBTITLE": "Vertrouwt u onze server niet? Behoud de volledige soevereiniteit over uw gegevens. Implementeer uw eigen privé-relayserver in enkele minuten.",
@@ -116,21 +126,21 @@
"FAQ_TITLE": "Veelgestelde vragen",
"FAQ_SUBTITLE": "Alles wat u moet weten over het samen bekijken van video's in perfecte synchronisatie.",
"FAQ_Q1": "Kan ik Netflix, Emby of Jellyfin samen in sync kijken met vrienden?",
"FAQ_A1": "Ja! KoalaSync werkt op Netflix, YouTube, Twitch en elke website met een HTML5-videospeler inclusief Emby, Jellyfin en zelfgehoste mediaservers. Installeer de extensie, maak een kamer, deel de uitnodigingslink en iedereen kijkt in perfecte sync.",
"FAQ_A1": "Ja! KoalaSync werkt op Netflix, YouTube, Twitch en elke website met een HTML5-videospeler, inclusief Emby, Jellyfin en zelfgehoste mediaservers. Installeer de extensie, maak een kamer, deel de uitnodigingslink en iedereen kijkt in perfecte sync.",
"FAQ_Q_VIDEO_ACCESS": "Streamt KoalaSync de video naar mijn vrienden?",
"FAQ_A_VIDEO_ACCESS": "Nee. KoalaSync streamt, host of deelt geen videocontent en omzeilt geen toegang tot videos. Iedereen kijkt de video lokaal in de eigen browser en heeft zelf toegang nodig tot de website of streamingdienst, bijvoorbeeld een eigen Netflix-account. KoalaSync synchroniseert alleen afspeelacties zoals afspelen, pauzeren en spoelen.",
"FAQ_Q2": "Is KoalaSync een gratis alternatief voor Teleparty?",
"FAQ_A2": "100% gratis en open-source onder de MIT-licentie. Geen premium-niveaus, geen vergrendelde functies, geen advertenties alles is inbegrepen. In tegenstelling tot Teleparty is de relayserver van KoalaSync alleen in het RAM-geheugen met nul gegevensverzameling of gebruikersaccounts vereist.",
"FAQ_A2": "100% gratis en open-source onder de MIT-licentie. Geen premium-niveaus, geen vergrendelde functies, geen advertenties, alles is inbegrepen. In tegenstelling tot Teleparty is de relayserver van KoalaSync alleen in het RAM-geheugen met nul gegevensverzameling of gebruikersaccounts vereist.",
"FAQ_Q3": "Werkt KoalaSync met Emby, Jellyfin en zelfgehoste mediaservers?",
"FAQ_A3": "Ja. KoalaSync detecteert elk standaard HTML5-video-element, wat betekent dat het perfect werkt met Emby, Jellyfin, Plex en elke aangepaste zelfgehoste streaminginstallatie. U kunt de KoalaSync-relayserver ook zelf hosten via Docker voor volledige soevereiniteit over uw gegevens.",
"FAQ_Q4": "Welke browsers en platforms ondersteunen KoalaSync?",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave en alle op Chromium gebaseerde browsers. Installeer het rechtstreeks vanuit de Chrome Web Store of Firefox Add-ons geen handmatige configuratie nodig.",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave en alle op Chromium gebaseerde browsers. Installeer het rechtstreeks vanuit de Chrome Web Store of Firefox Add-ons, geen handmatige configuratie nodig.",
"FAQ_Q5": "Moeten al mijn vrienden de extensie geïnstalleerd hebben?",
"FAQ_A5": "Ja, elke deelnemer moet KoalaSync geïnstalleerd hebben maar er is geen aanmelding of accountcreatie. Klik gewoon op de uitnodigingslink, installeer de extensie als u dat nog niet hebt gedaan, en u neemt binnen enkele seconden automatisch deel aan de kamer.",
"FAQ_A5": "Ja, elke deelnemer moet KoalaSync geïnstalleerd hebben, maar er is geen aanmelding of accountcreatie. Klik gewoon op de uitnodigingslink, installeer de extensie als u dat nog niet hebt gedaan, en u neemt binnen enkele seconden automatisch deel aan de kamer.",
"FAQ_Q6": "Zijn mijn gegevens veilig? Wat als ik de officiële server niet vertrouw?",
"FAQ_A6": "Volledig veilig. De relayserver van KoalaSync is alleen in het RAM-geheugen alle sessiegegevens worden permanent verwijderd zodra u de kamer verlaat. Geen database, geen logboeken, geen analyses, geen accounts. En als u de voorkeur geeft aan volledige controle: u kunt uw eigen privé-relayserver binnen enkele minuten zelf hosten via Docker. De volledige codebase is open-source en auditeerbaar op GitHub.",
"FAQ_A6": "Volledig veilig. De relayserver van KoalaSync is alleen in het RAM-geheugen, alle sessiegegevens worden permanent verwijderd zodra u de kamer verlaat. Geen database, geen logboeken, geen analyses, geen accounts. En als u de voorkeur geeft aan volledige controle: u kunt uw eigen privé-relayserver binnen enkele minuten zelf hosten via Docker. De volledige codebase is open-source en auditeerbaar op GitHub.",
"FAQ_Q7": "Kan ik stille dialogen en harde explosies oplossen bij het kijken van video's in de browser?",
"FAQ_A7": "Ja. KoalaSync 2.2.0 bevat een ingebouwde audiocompressor die het verschil tussen stille en luidruchtige delen van uw video verkleint. Het werkt lokaal via de Web Audio API geen audiogegevens verlaten ooit uw computer. Open de popup, maak een kamer, ga naar Instellingen → Audio Processing, schakel de compressor in en kies een preset. Werkt op Netflix, Prime Video, Disney+, YouTube en elke HTML5-videosite.",
"FAQ_A7": "Ja. KoalaSync 2.2.0 bevat een ingebouwde audiocompressor die het verschil tussen stille en luidruchtige delen van uw video verkleint. Het werkt lokaal via de Web Audio API, geen audiogegevens verlaten ooit uw computer. Open de popup, maak een kamer, ga naar Instellingen → Audio Processing, schakel de compressor in en kies een preset. Werkt op Netflix, Prime Video, Disney+, YouTube en elke HTML5-videosite.",
"HOWTO_TITLE": "Hoe video's te synchroniseren met vrienden via KoalaSync",
"HOWTO_DESC": "Bekijk elke video in perfecte synchronisatie met vrienden op YouTube, Netflix, Twitch en meer. Geen aanmelding, geen tracking.",
"HOWTO_STEP_1_NAME": "Installeer de browserextensie",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SYNC",
"MOCK_14": "Spring naar anderen",
"MOCK_15": "Laatste activiteitsstatus",
"MOCK_16": "Wachten op 1 deelnemer (KoalaPC)...",
"MOCK_16": "Wachten op 1 deelnemer (🐶 HappyDog)...",
"MOCK_17": "Overslaan & toch afspelen",
"MOCK_18": "Uw gebruikersnaam",
"MOCK_19": "Overbodige tabbladen verbergen",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync is niet verbonden aan, goedgekeurd door of geassocieerd met Netflix, Disney+, Amazon, YouTube, Twitch of enig ander streamingplatform. Alle handelsmerken zijn eigendom van hun respectieve eigenaren.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync - Alternatieven en vergelijkingen",
"ALT_INDEX_META_DESC": "Ontdek eerlijke vergelijkingen en gedetailleerde gidsen tussen KoalaSync en andere watchparty-extensies en streamingoplossingen.",
"ALT_INDEX_HEADING": "Gidsen en vergelijkingen",
"ALT_INDEX_INTRO": "Hoe verhoudt KoalaSync zich tot andere watchparty-tools en streamingoplossingen? Lees onze eerlijke, technische vergelijkingen en vind de beste keuze voor je filmavonden op afstand.",
"ALT_INDEX_READ_COMPARISON": "Vergelijking lezen →",
"ALT_INDEX_READ_GUIDE": "Gids lezen →",
"ALT_INDEX_FOOTER_LINK": "Gidsen en vergelijkingen",
"ALT_TELEPARTY_TITLE": "KoalaSync vs. Teleparty: welke tool voor 'watch parties' moet je kiezen?",
"ALT_TELEPARTY_META_DESC": "Een praktische vergelijking tussen KoalaSync en Teleparty voor watch parties, met aandacht voor ingebouwde chat, mobiele ondersteuning, videosynchronisatie in de browser, self-hosted mediaservers en open-sourcegebruik.",
"ALT_TELEPARTY_INTRO": "KoalaSync en Teleparty bieden allebei een oplossing voor hetzelfde vervelende probleem: samen iets kijken zonder dat gedoe met '3, 2, 1, afspelen'. Ze pakken het alleen anders aan.<br><br>Teleparty is de logische keuze als je een ingebouwde chatfunctie wilt of op mobiel wilt kijken. KoalaSync is meer geschikt voor watch parties via de desktopbrowser, waarbij je al met elkaar praat via Discord, Teamspeak of een andere spraakverbinding en alleen wilt dat het afspelen synchroon loopt.<br><br>De belangrijkste reden waarom ik KoalaSync heb ontwikkeld, is flexibiliteit. Het is bedoeld om te werken met vrijwel elke website die een standaard videospeler in de browser gebruikt, en niet slechts met een vaste lijst platforms. Dit omvat ook self-hosted systemen zoals Emby, Jellyfin en Plex, lokale of privé-domeinen en talloze reguliere videopagina's in de browser.",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSync is geen vervanging voor een spraakgesprek. Als je tijdens het kijken wilt praten, gebruik je gewoon Discord, Teamspeak, Signal, WhatsApp of wat je normaal ook gebruikt.<br><br>Iedereen heeft ook toegang tot de video of pagina op het eigen apparaat nodig. KoalaSync omzeilt geen abonnementen, inloggegevens, DRM, regionale beperkingen of platformregels.<br><br>Het werkt momenteel alleen in desktopbrowsers, heeft geen ingebouwde chat- of spraakfunctie en de compatibiliteit hangt altijd af van de browser en de videospeler.",
"ALT_SCREEN_SUMMARY_TITLE": "Samenvatting",
"ALT_SCREEN_SUMMARY_BODY": "Scherm delen is de eenvoudigste optie als je snel iets wilt doen en niet veel waarde hecht aan kwaliteit, privacy of individuele controle. KoalaSync is een betere keuze wanneer iedereen lokaal in de eigen browser moet kijken en de sessie meer moet aanvoelen als echt samen kijken.",
"ALT_TRY_KOALASYNC": "Probeer KoalaSync"
"ALT_W2G_TITLE": "KoalaSync vs Watch2Gether: welke watchparty-oplossing past beter?",
"ALT_W2G_META_DESC": "Een eerlijke vergelijking tussen KoalaSync en Watch2Gether. Ontdek wanneer de flexibiliteit van KoalaSync onverslaanbaar is en waarom Watch2Gether nog steeds de beste keuze is voor YouTube.",
"ALT_W2G_INTRO": "KoalaSync en Watch2Gether lossen beide hetzelfde probleem op: online video's online bekijken met vrienden zonder handmatig te coördineren. Hoewel Watch2Gether een van de oudste en meest populaire hubs is voor gedeelde filmavonden, hanteert KoalaSync een compleet andere, lichtgewicht aanpak. Welke tool voor jou geschikt is, hangt sterk af van wat en waar je wilt kijken.",
"ALT_W2G_WHEN_W2G_TITLE": "Wanneer Watch2Gether de betere keuze is",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether is onverslaanbaar voor <strong>YouTube-kijkfeesten</strong>. Dankzij de ingebouwde afspeellijst en zoekfunctie kan iedereen in de kamer eenvoudig nieuwe video's vinden, toevoegen en afspelen. Iedereen kijkt naadloos samen naar de volgende video.<br><br>Met KoalaSync op YouTube neemt de standaard autoplay van de site het over, waardoor elke gebruiker wordt omgeleid naar een andere aanbevolen video. Onze automatische functie voor volgende afleveringen (\"Episode Lobby\"), die prima werkt op Netflix of Disney+, werkt niet op YouTube vanwege deze dynamische aanbevelingen. Voor pure YouTube-avonden is Watch2Gether de betere keuze.",
"ALT_W2G_WHEN_KOALA_TITLE": "Wanneer KoalaSync beter past",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync schittert op <strong>echte streamingdiensten</strong> (Netflix, Prime Video, Disney+) en zelfgehoste mediaservers (Jellyfin, Plex, Emby). In tegenstelling tot Watch2Gether, dat vaak helemaal geen premium-inhoud kan afspelen, synchroniseert KoalaSync de native speler rechtstreeks op de website.<br><br>Het werkt op vrijwel elke site met een standaard HTML5-videospeler. U hoeft geen virtuele kamer op te zetten op een site van derden: activeer gewoon de extensie, sluit u aan bij een lobby en begin met kijken.",
"ALT_W2G_MAIN_DIFF_TITLE": "Het belangrijkste verschil",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether is een <strong>zelfstandige website</strong> met ingebouwde chat, afspeellijsten en webcamondersteuning. KoalaSync is een <strong>minimalistische browserextensie</strong> die rechtstreeks aansluit op je normale browsertabbladen.<br><br>Op zoek naar een alles-in-één pakket voor YouTube met ingebouwde chat? Gebruik Watch2Gether. Wil je films kijken op Netflix of je eigen server zonder afleiding, in native kwaliteit (geen servercompressie)? KoalaSync is de schonere oplossing.",
"ALT_W2G_LIMITS_TITLE": "Eerlijke beperkingen",
"ALT_W2G_LIMITS_BODY": "KoalaSync <strong>heeft geen ingebouwde afspeellijsten of videozoekfunctie</strong>. Op YouTube betekent dit dat het automatisch afspelen van de volgende video niet gesynchroniseerd blijft.<br><br>Bovendien is er <strong>geen ingebouwde chat</strong> en werkt KoalaSync momenteel alleen in desktopbrowsers. Het is ontworpen in de veronderstelling dat je sowieso al via Discord, Teamspeak of andere spraaktools praat.",
"ALT_W2G_SUMMARY_TITLE": "Kortom",
"ALT_W2G_SUMMARY_BODY": "Voor spontane YouTube-sessies met afspeellijsten en ingebouwde chat is Watch2Gether de beste keuze. Voor premium streamingplatforms (zoals Netflix, Prime Video, Disney+), zelfgehoste servers (Jellyfin, Plex, Emby) en maximale browserflexibiliteit is KoalaSync de geschiktere en lichtgewicht tool.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener: welk watchparty-platform past beter?",
"ALT_SCENER_META_DESC": "Een eerlijke vergelijking van KoalaSync en Scener. Ontdek wanneer de webcamchat van Scener wint en waarom KoalaSync het beste is voor filmavonden zonder afleiding.",
"ALT_SCENER_INTRO": "KoalaSync en Scener benaderen feestjes vanuit twee totaal verschillende invalshoeken. Scener is een virtuele bioscoop met ingebouwde videochat en interactieve kamers. KoalaSync daarentegen is een minimalistische, privacyvriendelijke browserextensie die eenvoudig de afspeelbedieningen synchroniseert. Welke tool het beste bij u past, hangt vooral af van hoe belangrijk ingebouwde webcam- en chatfuncties voor u zijn.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Wanneer Scener de betere keuze is",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener is een solide keuze als je een <strong>alles-in-één sociaal platform</strong> met ingebouwde video- en audiochat rechtstreeks in je browser wilt. Scener creëert een virtuele kamer waar de webcams van de speler en je vrienden naast elkaar worden weergegeven. Dit is ideaal voor grote, openbare kijkfeesten of virtuele streamingevenementen waarbij het sociale aspect centraal staat. Houd er echter rekening mee dat de gratis basisversie door advertenties wordt ondersteund en dat Scener veel functies (zoals advertentievrij kijken en onbeperkt videochatten) vergrendelt achter een maandelijks abonnement ($ 5,79/maand of $ 39,99/jaar).",
"ALT_SCENER_WHEN_KOALA_TITLE": "Wanneer KoalaSync beter past",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync schittert als het gaat om <strong>videokwaliteit, privacy en eenvoud</strong>:<br><br>• <strong>Geen accounts</strong>: u hoeft zich niet te registreren, in te loggen of profielen te beheren. Activeer gewoon de extensie, deel een kamercode en begin met kijken.<br>• <strong>Echte native kwaliteit (4K/HDR)</strong>: Scener streamt gecomprimeerde video vanaf een virtuele cloudserver, wat kan leiden tot kwaliteitsverlies en vertraging. KoalaSync synchroniseert de native speler rechtstreeks op uw computer, wat betekent dat u films bekijkt in de volledige resolutie van uw streamingabonnement.<br>• <strong>Laag bandbreedtegebruik</strong>: Omdat alleen besturingsgegevens (afspelen, pauzeren, tijdstempels) worden verzonden, gebruikt KoalaSync vrijwel geen extra bandbreedte. Scener streamt de volledige video- en camerafeeds via cloudservers, wat tragere internetverbindingen en oudere laptops zwaar kan belasten.<br>• <strong>100% gratis en advertentievrij</strong>: geen maandelijkse abonnementskosten, geen advertenties en geen trackers.<br>• <strong>Lokale videobestanden</strong>: aangezien KoalaSync lokaal draait, kun je zelfs je eigen videobestanden (zoals MP4) bekijken, gesynchroniseerd met vrienden. Sleep het bestand gewoon naar een browsertabblad. Scener kan dit niet doen omdat de speler in de cloud draait.",
"ALT_SCENER_MAIN_DIFF_TITLE": "Het belangrijkste verschil",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener is een <strong>commercieel sociaal netwerk</strong> voor kijkfeesten dat wordt aangedreven door virtuele cloudbrowsers en wordt gefinancierd via advertenties en maandelijkse abonnementen. KoalaSync is een <strong>privacy-first, gratis synchronisatiehulpprogramma</strong> dat rechtstreeks op uw browsertabbladen aansluit. Het laat spraak-/videochat over aan applicaties zoals Discord of Teamspeak, waarbij de nadruk volledig ligt op het vloeiend, privé en in de oorspronkelijke originele kwaliteit houden van het afspelen.",
"ALT_SCENER_LIMITS_TITLE": "Eerlijke beperkingen",
"ALT_SCENER_LIMITS_BODY": "KoalaSync biedt <strong>geen ingebouwde chat- of webcamondersteuning</strong>. Het is puur een synchronisatietool en vereist een afzonderlijk hulpmiddel voor spraakoproepen naar keuze. Bovendien is KoalaSync momenteel alleen beschikbaar voor desktops, en de compatibiliteit van lokale videobestanden hangt volledig af van de vraag of uw browser het afspelen van het videoformaat en de audiocodecs standaard ondersteunt.",
"ALT_SCENER_SUMMARY_TITLE": "Kortom",
"ALT_SCENER_SUMMARY_BODY": "Voor grote kijkfeesten met ingebouwde webcamchat en sociale functies is Scener de juiste keuze, op voorwaarde dat je advertenties en premium betaalmuren niet erg vindt. Als je een volledig gratis, advertentievrije en afleidingsvrije ervaring wilt in de native speler (inclusief Netflix, Prime Video, Disney+ of lokale browserbestanden) en je bent al bezig met een telefoongesprek, dan is KoalaSync de schonere en beter presterende oplossing.",
"ALT_KOSMI_TITLE": "KoalaSync versus Kosmi: welk Netflix-feestalternatief past beter?",
"ALT_KOSMI_META_DESC": "Een eerlijke vergelijking van KoalaSync en Kosmi. Ontdek waarom Kosmi's configuratie zonder extensie handig is en wanneer de native videokwaliteit van KoalaSync wint.",
"ALT_KOSMI_INTRO": "Zowel KoalaSync als Kosmi bieden geweldige manieren om Netflix, YouTube en andere platforms gesynchroniseerd met vrienden te bekijken. Hun onderliggende technologieën zijn echter fundamenteel verschillend. Kosmi maakt gebruik van virtuele cloudbrowsers die rechtstreeks in uw webbrowser worden uitgevoerd zonder extensies te installeren. KoalaSync is een lichtgewicht extensie die uw lokale videospeler synchroniseert. Welke aanpak het beste bij u past, hangt af van uw prioriteiten op het gebied van videokwaliteit, gemak en privacy.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Wanneer Kosmi de betere keuze is",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi is onverslaanbaar als je <strong>niets wilt installeren</strong> of wilt kijken op apparaten zoals tablets en smartphones. Omdat Kosmi virtuele browsers in de cloud draait, is het enige dat nodig is om deel te nemen een eenvoudige weblink. Bovendien is Kosmi een alles-in-één hangoutplatform: naast gesynchroniseerde streaming kun je multiplayer-spellen spelen (zoals retro NES/SNES-klassiekers of poker) en de ingebouwde webcam, stem- en tekstchat gebruiken. Als je een sociale game-avond wilt en een feestje wilt kijken zonder opstelling, is Kosmi een fantastische oplossing.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "Wanneer KoalaSync beter past",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync blinkt uit als het gaat om <strong>native afspeelkwaliteit, beveiliging en prestaties</strong>:<br><br>• <strong>Geen beveiligingsrisico's</strong>: met Kosmi moet je inloggen op je Netflix- of Prime-account op een externe virtuele computer in de cloud. Met KoalaSync log je veilig in op de officiële streamingwebsite in je eigen browser, net zoals je normaal doet. Je wachtwoorden verlaten je machine nooit.<br>• <strong>Volledige videokwaliteit (4K/HDR)</strong>: Kosmi streamt het scherm van de virtuele browser als een gecomprimeerde videofeed, wat kan resulteren in pixelvorming en buffering. KoalaSync synchroniseert de native spelers lokaal: je geniet van films in de volledige, kristalheldere resolutie van je abonnement.<br>• <strong>Lag-vrij en bandbreedtevriendelijk</strong>: omdat KoalaSync alleen besturingsopdrachten verzendt (afspelen/pauzeren/tijdstempels), gebruikt het bijna geen bandbreedte. Kosmi streamt voortdurend HD-videofeeds, waardoor langzamere verbindingen kunnen worden overweldigd.<br>• <strong>Lokale videobestanden</strong>: als je een privévideo wilt bekijken, sleep je het MP4-bestand gewoon naar een browsertabblad en synchroniseer je het. Kosmi heeft geen toegang tot bestanden op uw lokale harde schijf.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "Het belangrijkste verschil",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi is een <strong>virtuele cloud-hangout</strong> die het scherm van een externe browser streamt, zodat niemand een extensie hoeft te installeren. KoalaSync is een <strong>lokale browsersynchronisatielaag</strong> die rechtstreeks aansluit op de native speler op de officiële streamingwebsite. Hoewel Kosmi veelzijdiger is op het gebied van minigames en apparaatcompatibiliteit, biedt KoalaSync een veiligere, vloeiendere en scherpere streamingervaring in de originele speler.",
"ALT_KOSMI_LIMITS_TITLE": "Eerlijke beperkingen",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync <strong>vereist de installatie van een browserextensie</strong> en werkt momenteel alleen op desktop-pc's. Het <strong>heeft geen ingebouwde chat of webcams</strong>, omdat het is ontworpen in de veronderstelling dat je toch al via Discord of andere stemhulpmiddelen praat. Het biedt ook geen ingebouwde games.",
"ALT_KOSMI_SUMMARY_TITLE": "Kortom",
"ALT_KOSMI_SUMMARY_BODY": "Voor informele game-avonden met retro-klassiekers en gemakkelijke toegang op mobiele apparaten zonder enige installatie is Kosmi ideaal. Voor premium filmavonden op Netflix, Prime Video, Disney+ of Plex in volledige 4K-kwaliteit, met maximale beveiliging en minimale impact op de bandbreedte, is KoalaSync de duidelijke winnaar.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven: welke watchparty-oplossing past beter?",
"ALT_TWOSEVEN_META_DESC": "Een eerlijke vergelijking van KoalaSync en TwoSeven. Ontdek wanneer de ingebouwde webcam van TwoSeven wint en waarom KoalaSync het beste is voor Disney+ en Netflix.",
"ALT_TWOSEVEN_INTRO": "Zowel KoalaSync als TwoSeven gebruiken dezelfde basisaanpak voor kijkfeesten: ze synchroniseren de originele videospeler rechtstreeks in uw browser, in plaats van een gecomprimeerde videofeed vanuit de cloud te streamen. Dit zorgt voor videokwaliteit van het hoogste niveau voor beide tools. Hoewel TwoSeven een commerciële portal is met ingebouwde webcamchat en abonnementsniveaus, blijft KoalaSync een minimalistische, volledig gratis en privacyvriendelijke extensie. Ontdek hier welke dienst het beste bij u past.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "Wanneer TwoSeven de betere keuze is",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven is de juiste keuze als u een <strong>alles-in-één oplossing met geïntegreerde webcam en audiochat</strong> rechtstreeks in uw browser wilt. Als je je vrienden wilt zien tijdens het kijken zonder Discord of Teamspeak op de achtergrond te hoeven draaien, biedt TwoSeven deze integratie native. Bovendien werkt het voor YouTube en een paar open webvideospelers zonder extensies. Het is zeer geschikt voor kleine groepen van 2 tot 3 personen die tijdens het kijken een visuele verbinding willen delen.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "Wanneer KoalaSync beter past",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync schittert met zijn <strong>volledige gebrek aan kosten, privacy en eenvoud</strong>:<br><br>• <strong>Geen betaalmuren</strong>: om premiumdiensten zoals Disney+ of Hulu synchroon te bekijken op TwoSeven, moet ten minste één kamerlid deze ondersteunen op Patreon (vanaf $ 3/maand). KoalaSync synchroniseert Netflix, Prime Video, Disney+ en zelfgehoste mediaservers (Jellyfin, Plex, Emby) 100% gratis en zonder beperkingen.<br>• <strong>Absolute privacy (geen trackers/advertenties)</strong>: TwoSeven wordt door advertenties ondersteund en gebruikt meerdere trackers van Google, Facebook en anderen. KoalaSync heeft geen advertenties, geen trackers en communiceert uitsluitend met de relay-server met alleen RAM.<br>• <strong>Geen registratie vereist</strong>: TwoSeven vereist dat alle deelnemers een account aanmaken en inloggen. KoalaSync is volledig accountvrij. Gewoon installeren, een kamercode invoeren en beginnen met kijken.<br>• <strong>Lichtgewicht en gebruiksvriendelijk</strong>: de geïntegreerde webcam en audiofeeds van TwoSeven belasten uw CPU en netwerk zwaar. Door de communicatie over te laten aan tools als Discord, werkt KoalaSync uiterst soepel en wordt de levensduur van de batterij verlengd.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "Het belangrijkste verschil",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven is een <strong>commercieel platform</strong> met registratievereisten, advertenties, peer-to-peer webcamchats en Patreon-betaalmuren voor specifieke streamingdiensten. KoalaSync is een <strong>gratis, open-source hulpprogramma</strong> dat rechtstreeks op uw browsertabbladen aansluit, zonder accounts, trackers of extra kosten, waardoor u zonder afleiding kunt kijken in de native speler.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Eerlijke beperkingen",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync biedt <strong>geen ingebouwde webcam of audiochat</strong> en gaat ervan uit dat je al aan het bellen bent via Discord of een soortgelijke tool. Bovendien heeft KoalaSync geen ingebouwde chatbox-overlay en is deze momenteel alleen op de desktop beschikbaar.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "Kortom",
"ALT_TWOSEVEN_SUMMARY_BODY": "Voor kleine groepjes van twee of drie personen die elkaar via webcams direct in de browser willen zien en het niet erg vinden om een Patreon voor Disney+ ondersteuning te ondersteunen, is TwoSeven een leuke optie. Voor advertentievrije, volledig gratis en privéfilmavonden in native 4K-kwaliteit (of het nu Netflix, Prime Video, Disney+ of Jellyfin is) zonder registratie, is KoalaSync de schonere en veiligere keuze.",
"ALT_TRY_KOALASYNC": "Probeer KoalaSync",
"MOCK_HOST_CONTROL_LABEL": "Hostbeheer",
"MOCK_HOST_CONTROL_TOGGLE": "Alleen ik mag de weergave bedienen",
"LABEL_SELECT_VIDEO": "Selecteer video",
"OPTION_SELECT_TAB": "-- Selecteer een tabblad --",
"THEME_TOGGLE_LABEL": "Licht/donker thema wisselen",
"FAQ_SHOW_ALL": "Alle vragen tonen",
"FAQ_HIDE_ALL": "Vragen verbergen",
"SELF_SHOW_SETUP": "Installatiehandleiding tonen",
"SELF_HIDE_SETUP": "Handleiding verbergen",
"HERO_TRUST": "Gratis · Open source · Geen account nodig",
"COMP_MORE_GUIDES": "Volledige vergelijking en meer alternatieven"
}
+113 -33
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "pl_PL",
"META_TITLE": "KoalaSync | Synchronizuj Netflix, YouTube i dowolne wideo ze znajomymi",
"META_DESCRIPTION": "Oglądaj Netflix, YouTube, Twitch i dowolne wideo HTML5 w idealnej synchronizacji ze znajomymi. Darmowe rozszerzenie o otwartym kodzie dla Chrome i Firefox. Bez rejestracji.",
"SCHEMA_APP_DESC": "Oglądaj Netflix, YouTube, Twitch i dowolne wideo HTML5 w idealnej synchronizacji ze znajomymi. Darmowe rozszerzenie o otwartym kodzie dla Chrome i Firefox. Bez rejestracji.",
"OG_TITLE": "KoalaSync | Synchronizuj Netflix, Emby, Jellyfin i prawie każde wideo ze znajomymi",
"OG_DESCRIPTION": "Oglądaj Netflix, Emby, Jellyfin, YouTube, Twitch i prawie każde wideo HTML5 w idealnej synchronizacji. Zorientowane na prywatność rozszerzenie o otwartym kodzie dla Chrome i Firefox.",
"TWITTER_TITLE": "KoalaSync | Synchronizuj Netflix, Emby, Jellyfin i prawie każde wideo ze znajomymi Rozszerzenie przeglądarki",
"TWITTER_DESCRIPTION": "Oglądaj Netflix, Emby, Jellyfin, YouTube, Twitch i prawie każde wideo HTML5 w idealnej synchronizacji ze znajomymi. Zorientowane na prywatność rozszerzenie o otwartym kodzie dla Chrome i Firefox.",
"META_TITLE": "KoalaSync | Watch party dla Netflix, YouTube i innych",
"META_DESCRIPTION": "Watch party na Netflix, YouTube, Twitch i dowolnym wideo HTML5. Darmowe, otwarte rozszerzenie do Chrome i Firefox. Bez konta, bez śledzenia, bez reklam.",
"SCHEMA_APP_DESC": "Watch party na Netflix, YouTube, Twitch i dowolnym wideo HTML5. Darmowe, otwarte rozszerzenie do Chrome i Firefox. Bez konta, bez śledzenia, bez reklam.",
"OG_TITLE": "KoalaSync | Watch party dla Netflix, Emby, Jellyfin i prawie każdego wideo",
"OG_DESCRIPTION": "Zorganizuj watch party na Netflix, Emby, Jellyfin, YouTube, Twitch i prawie każdym wideo HTML5. Open source, prywatnie i bez konta.",
"TWITTER_TITLE": "KoalaSync | Watch party dla Netflix, Emby, Jellyfin i prawie każdego wideo Rozszerzenie",
"TWITTER_DESCRIPTION": "Zorganizuj watch party na Netflix, Emby, Jellyfin, YouTube, Twitch i prawie każdym wideo HTML5. Open source, prywatnie i bez konta.",
"NAV_FEATURES": "Funkcje",
"NAV_HOW_IT_WORKS": "Jak to działa",
"HERO_TITLE": "Oglądajcie Razem.<span class='hero-line2'>Synchronizujcie Idealnie.</span>",
"HERO_SUBTITLE": "Twój zdalny wieczór filmowy bez opóźnień. Bez rejestracji, bez zbierania danych. Po prostu udostępnij link i oglądajcie razem.",
"HERO_TITLE": "Zamień dowolne wideo w <span class='hero-highlight'>watch party</span>.",
"HERO_SUBTITLE": "Twój zdalny wieczór filmowy bez opóźnień. Bez konta, bez śledzenia, bez reklam. Udostępnij link i naciśnijcie play razem.",
"HERO_MASCOT_ALT": "Uroczy koala stojący i patrzący w dół na przyciski pobierania",
"DEMO_SYNC": "Zsynchronizowane",
"DEMO_HINT": "Demo na żywo: naciśnij play w dowolnej karcie, a KoalaSync utrzyma obie w synchronizacji.",
"DEMO_NO_ROOM": "Jeszcze nie połączono",
"DEMO_CREATE_ROOM": "Utwórz pokój",
"DEMO_JOINED": "Dołączono do pokoju",
"DEMO_TAB_SELECTED": "Karta wybrana",
"DEMO_SELECT_PLACEHOLDER": "Wybierz kartę wideo…",
"MOBILE_DEMO_CTA": "Zobacz, jak działa",
"MOBILE_DEMO_TITLE": "Demo live KoalaSync",
"MOBILE_DEMO_CLOSE": "Zamknij demo",
"ADD_TO_CHROME": "Dodaj do Chrome",
"ADD_TO_FIREFOX": "Dodaj do Firefox",
"COMPAT_HEADING": "Działa na Twoich ulubionych platformach",
@@ -35,22 +45,22 @@
"USE_CASE_3_DESC": "Pokonaj odległość i ciesz się randkami. Przeżywajcie każdy zwrot akcji, śmiejcie się z tych samych żartów i dzielcie emocje w tej samej milisekundzie.",
"WHY_TITLE": "Dlaczego KoalaSync?",
"WHY_SUBTITLE": "Stworzony z myślą o niezawodnej synchronizacji, prywatności i łatwej konfiguracji.",
"FEATURE_1_TITLE": "Pełna kontrola / Natychmiastowa synchronizacja",
"FEATURE_1_DESC": "Jeden zatrzymuje, wszyscy zatrzymują. Jeden przewija, wszyscy podążają. Nasz dwufazowy protokół synchronizacji koordynuje odtwarzanie w czasie rzeczywistym u wszystkich uczestników.",
"FEATURE_1_TITLE": "Kontrola hosta i synchronizacja",
"FEATURE_1_DESC": "Decydujesz, kto steruje odtwarzaniem. Włącz kontrolę hosta, aby tylko Ty mógł wstrzymywać i przewijać, lub mianuj współhostów.",
"FEATURE_2_TITLE": "Niekończące się oglądanie",
"FEATURE_2_DESC": "Autoodtwarzanie w synchronizacji. KoalaSync automatycznie wykrywa zmiany odcinków i wstrzymuje odtwarzanie, dopóki wszyscy uczestnicy nie załadują następnego filmu.",
"FEATURE_3_TITLE": "Zero kont / Czysta prywatność",
"FEATURE_3_DESC": "Bez rejestracji, bez śledzenia, bez trwałych śladów. Serwer działa w całości w pamięci RAM i czyści Twój pokój, gdy go opuszczasz.",
"FEATURE_4_TITLE": "Uniwersalne wsparcie HTML5",
"FEATURE_4_DESC": "Działa na YouTube, Twitch, Netflix, Jellyfin, Emby i prawie każdej standardowej stronie z elementem wideo HTML5. Kompatybilny również z własnymi serwerami. Żadne dane wideo nigdy nie są wysyłane na nasze serwery — jedynie metadane synchronizacji.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby i niemal każda strona z wideo HTML5. Przeglądarkę opuszczają tylko sygnały synchronizacji, nigdy wideo.",
"FEATURE_5_TITLE": "Możliwość własnego hostowania i wsparcie Docker",
"FEATURE_5_DESC": "Nasze oficjalne serwery są darmowe i szybkie, ale możesz przejąć pełną kontrolę, jeśli chcesz. Uruchom własny serwer w kilka sekund za pomocą Dockera.",
"FEATURE_6_TITLE": "Natychmiastowe zaproszenia / Dołączanie 1 kliknięciem",
"FEATURE_6_DESC": "Bez wymiany adresów IP czy haseł. Udostępnij wygenerowany link zaproszenia znajomym, aby mogli automatycznie dołączyć do pokoju jednym kliknięciem.",
"FEATURE_7_TITLE": "Wyrównywanie głośności / Kompresor audio",
"FEATURE_7_DESC": "Koniec z ciągłym regulowaniem głośności. Wbudowany kompresor audio wzmacnia ciche dialogi i łagodzi głośne eksplozje. Działa na Netflix, Prime Video, Disney+, YouTube i każdym filmie HTML5. W pełni lokalny — żadne dane audio nie opuszczają twojego komputera.",
"FEATURE_7_DESC": "Koniec z ciągłym regulowaniem głośności. Wbudowany kompresor podbija ciche dialogi i wycisza głośne wybuchy, a wszystko przetwarzane lokalnie w przeglądarce.",
"FEATURE_8_TITLE": "Open Source (Licencja MIT)",
"FEATURE_8_DESC": "Cały kod źródłowy jest publicznie dostępny i możliwy do zweryfikowania na GitHubie. Żadnych czarnych skrzynek, żadnych własnościowych obiektów blob 100% przejrzystości od serwera przekaźnikowego (relay server) po rozszerzenie przeglądarki.",
"FEATURE_8_DESC": "Cały kod źródłowy jest publicznie dostępny i możliwy do zweryfikowania na GitHubie. Żadnych czarnych skrzynek, żadnych własnościowych obiektów blob. 100% przejrzystości od serwera przekaźnikowego (relay server) po rozszerzenie przeglądarki.",
"COMP_TITLE": "KoalaSync vs. Teleparty",
"COMP_SUBTITLE": "Zobacz, dlaczego otwarty kod, brak reklam i ochrona prywatności to lepszy sposób na wspólne oglądanie.",
"COMP_COL_FEATURE": "Funkcja",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Polityka prywatności Teleparty i zbieranie danych śledzenia:",
"COMP_FOOTNOTE_4": "Działa na stronach zezwalających na wstrzykiwanie skryptów do standardowych tagów wideo HTML5. Strony z bardzo rygorystycznymi zasadami bezpieczeństwa (CSP), zabezpieczeniami DRM (kopiowanie) lub mocno zaciemnionymi odtwarzaczami (jak złożone systemy shadow DOM) mogą ograniczać zdalne sterowanie.",
"STEPS_TITLE": "Jak zacząć",
"STEP_1_TITLE": "Zainstaluj rozszerzenie",
"STEP_1_DESC": "Dodaj KoalaSync do swojej przeglądarki z Chrome Web Store, Firefox Add-ons lub pobierz najnowsze archiwum ZIP dla deweloperów z GitHub.",
"STEP_1_ILLUS_DESC": "Synchronizator wideo dbający o prywatność",
"STEP_1_ILLUS_DL_CHROME": "Pobierz dla Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Pobierz dla Firefox",
"STEP_1_ILLUS_ACTIVE": "Rozszerzenie aktywne",
"STEP_1_ILLUS_READY": "Gotowe do wspólnego oglądania!",
"STEP_2_TITLE": "Utwórz pokój",
"STEP_2_DESC": "Otwórz okienko rozszerzenia i kliknij '+ Utwórz nowy pokój'. KoalaSync automatycznie wygeneruje bezpieczny ID pokoju oraz hasło, dołączy do niego i skopiuje link zaproszenia do schowka.",
"STEP_1_TITLE": "Utwórz i udostępnij pokój",
"STEP_1_DESC": "Otwórz rozszerzenie, utwórz pokój jednym kliknięciem i udostępnij link znajomym. Dołączą natychmiast przez link z zaproszeniem.",
"STEP_1_ILLUS_DESC": "Wybierz kartę do połączenia",
"STEP_1_ILLUS_DL_CHROME": "Połącz kartę YouTube",
"STEP_1_ILLUS_DL_FIREFOX": "Połącz kartę Netflix",
"STEP_1_ILLUS_ACTIVE": "Karta połączona",
"STEP_1_ILLUS_READY": "Gotowe do synchronizacji !",
"STEP_2_TITLE": "Wybierz kartę z wideo",
"STEP_2_DESC": "Przejdź do karty ze swoim wideo i wybierz ją w menu rozszerzenia. KoalaSync automatycznie połączy Wasze odtwarzacze.",
"STEP_2_ILLUS_ROOM": "Pokój",
"STEP_2_ILLUS_SYNC": "Sync",
"STEP_2_ILLUS_SETTINGS": "Ustawienia",
"STEP_2_ILLUS_CREATE": "+ Utwórz nowy pokój",
"STEP_2_ILLUS_MANUAL": "Połączenie ręczne / Zaawansowane",
"STEP_2_ILLUS_COPIED": "Link zaproszenia skopiowany!",
"STEP_3_TITLE": "Udostępnij i synchronizuj",
"STEP_3_DESC": "Wyślij link zaproszenia znajomym. Gdy dołączą, wybierz kartę z filmem i ciesz się zsynchronizowanym odtwarzaniem.",
"STEP_3_TITLE": "Ciesz się synchronizacją",
"STEP_3_DESC": "Naciśnij odtwarzaj. Gdy ktoś wstrzyma, przewinie lub odtworzy wideo, odtwarzanie u wszystkich pozostanie idealnie zsynchronizowane.",
"STEP_3_ILLUS_IN_SYNC": "ZSYNCHRONIZOWANO",
"SELF_TITLE": "Dla hostujących samodzielnie",
"SELF_SUBTITLE": "Nie ufasz naszemu serwerowi? Zachowaj pełną suwerenność danych. Wdróż własny prywatny serwer w kilka minut.",
@@ -116,21 +126,21 @@
"FAQ_TITLE": "Często zadawane pytania",
"FAQ_SUBTITLE": "Wszystko, co musisz wiedzieć o wspólnym oglądaniu filmów w idealnej synchronizacji.",
"FAQ_Q1": "Czy mogę oglądać Netflix, Emby lub Jellyfin w synchronizacji ze znajomymi?",
"FAQ_A1": "Tak! KoalaSync działa na Netflix, YouTube, Twitch i każdej stronie z odtwarzaczem wideo HTML5 w tym Emby, Jellyfin i własnych serwerach mediów. Zainstaluj rozszerzenie, utwórz pokój, udostępnij link i wszyscy oglądają w idealnej synchronizacji.",
"FAQ_A1": "Tak! KoalaSync działa na Netflix, YouTube, Twitch i każdej stronie z odtwarzaczem wideo HTML5, w tym Emby, Jellyfin i własnych serwerach mediów. Zainstaluj rozszerzenie, utwórz pokój, udostępnij link i wszyscy oglądają w idealnej synchronizacji.",
"FAQ_Q_VIDEO_ACCESS": "Czy KoalaSync przesyła wideo do moich znajomych?",
"FAQ_A_VIDEO_ACCESS": "Nie. KoalaSync nie przesyła, nie hostuje, nie udostępnia ani nie omija dostępu do treści wideo. Każda osoba ogląda wideo lokalnie we własnej przeglądarce i potrzebuje własnego dostępu do danej strony lub usługi streamingowej, na przykład własnego konta Netflix. KoalaSync synchronizuje tylko akcje odtwarzania, takie jak odtwarzanie, pauza i przewijanie.",
"FAQ_Q2": "Czy KoalaSync to darmowa alternatywa dla Teleparty?",
"FAQ_A2": "W 100% darmowy i o otwartym kodzie na licencji MIT. Brak planów premium, brak zablokowanych funkcji, brak reklam wszystko jest w cenie. W przeciwieństwie do Teleparty, serwer KoalaSync działa tylko w pamięci RAM, bez zbierania danych i bez kont użytkowników.",
"FAQ_A2": "W 100% darmowy i o otwartym kodzie na licencji MIT. Brak planów premium, brak zablokowanych funkcji, brak reklam, wszystko jest w cenie. W przeciwieństwie do Teleparty, serwer KoalaSync działa tylko w pamięci RAM, bez zbierania danych i bez kont użytkowników.",
"FAQ_Q3": "Czy KoalaSync działa z Emby, Jellyfin i własnymi serwerami mediów?",
"FAQ_A3": "Tak. KoalaSync wykrywa każdy standardowy element wideo HTML5, co oznacza, że działa idealnie z Emby, Jellyfin, Plexem i dowolnymi własnymi rozwiązaniami streamingowymi. Możesz również samodzielnie hostować serwer przez Dockera.",
"FAQ_Q4": "Które przeglądarki i platformy obsługują KoalaSync?",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave i wszystkie przeglądarki oparte na Chromium. Zainstaluj je bezpośrednio z Chrome Web Store lub Firefox Add-ons nie jest wymagana ręczna konfiguracja.",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave i wszystkie przeglądarki oparte na Chromium. Zainstaluj je bezpośrednio z Chrome Web Store lub Firefox Add-ons, nie jest wymagana ręczna konfiguracja.",
"FAQ_Q5": "Czy wszyscy moi znajomi muszą mieć zainstalowane rozszerzenie?",
"FAQ_A5": "Tak, każdy uczestnik musi mieć zainstalowane KoalaSync ale nie ma rejestracji ani tworzenia kont. Po prostu kliknij link zaproszenia, zainstaluj rozszerzenie, jeśli jeszcze tego nie zrobiłeś, a dołączysz do pokoju automatycznie w kilka sekund.",
"FAQ_A5": "Tak, każdy uczestnik musi mieć zainstalowane KoalaSync, ale nie ma rejestracji ani tworzenia kont. Po prostu kliknij link zaproszenia, zainstaluj rozszerzenie, jeśli jeszcze tego nie zrobiłeś, a dołączysz do pokoju automatycznie w kilka sekund.",
"FAQ_Q6": "Czy moje dane są bezpieczne? Co jeśli nie ufam oficjalnemu serwerowi?",
"FAQ_A6": "Całkowicie bezpieczne. Serwer KoalaSync działa tylko w pamięci RAM wszystkie dane sesji są trwale usuwane w momencie opuszczenia pokoju. Brak bazy danych, brak logowania, brak analityki, brak kont. A jeśli wolisz pełną kontrolę: możesz samodzielmente uruchomić własny serwer przez Dockera w kilka minut. Cały kod źródłowy jest otwarty i dostępny na GitHubie.",
"FAQ_A6": "Całkowicie bezpieczne. Serwer KoalaSync działa tylko w pamięci RAM, wszystkie dane sesji są trwale usuwane w momencie opuszczenia pokoju. Brak bazy danych, brak logowania, brak analityki, brak kont. A jeśli wolisz pełną kontrolę: możesz samodzielmente uruchomić własny serwer przez Dockera w kilka minut. Cały kod źródłowy jest otwarty i dostępny na GitHubie.",
"FAQ_Q7": "Czy mogę naprawić ciche dialogi i głośne eksplozje podczas oglądania filmów w przeglądarce?",
"FAQ_A7": "Tak. KoalaSync 2.2.0 zawiera wbudowany kompresor audio, który zmniejsza różnicę między cichymi a głośnymi częściami filmu. Działa lokalnie przez Web Audio API żadne dane audio nie opuszczają twojego komputera. Otwórz popup, utwórz pokój, przejdź do Ustawienia → Audio Processing, włącz kompresor i wybierz preset. Działa na Netflix, Prime Video, Disney+, YouTube i każdej stronie z wideo HTML5.",
"FAQ_A7": "Tak. KoalaSync 2.2.0 zawiera wbudowany kompresor audio, który zmniejsza różnicę między cichymi a głośnymi częściami filmu. Działa lokalnie przez Web Audio API, żadne dane audio nie opuszczają twojego komputera. Otwórz popup, utwórz pokój, przejdź do Ustawienia → Audio Processing, włącz kompresor i wybierz preset. Działa na Netflix, Prime Video, Disney+, YouTube i każdej stronie z wideo HTML5.",
"HOWTO_TITLE": "Jak synchronizować wideo ze znajomymi za pomocą KoalaSync",
"HOWTO_DESC": "Oglądaj dowolne wideo w idealnej synchronizacji ze znajomymi na YouTube, Netflix, Twitch i innych. Bez rejestracji, bez śledzenia.",
"HOWTO_STEP_1_NAME": "Zainstaluj rozszerzenie przeglądarki",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SYNC",
"MOCK_14": "Skocz do innych",
"MOCK_15": "Status ostatniej aktywności",
"MOCK_16": "Oczekiwanie na 1 uczestnika (KoalaPC)...",
"MOCK_16": "Oczekiwanie na 1 uczestnika (🐶 HappyDog)...",
"MOCK_17": "Pomiń i odtwórz mimo to",
"MOCK_18": "Twoja nazwa użytkownika",
"MOCK_19": "Ukryj zbędne karty",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync nie jest powiązany, wspierany ani stowarzyszony z Netflix, Disney+, Amazon, YouTube, Twitch ani żadną inną platformą streamingową. Wszystkie znaki towarowe są własnością ich odpowiednich właścicieli.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync - Alternatywy i porównania",
"ALT_INDEX_META_DESC": "Poznaj uczciwe porównania i szczegółowe poradniki zestawiające KoalaSync z innymi rozszerzeniami do watch party oraz rozwiązaniami streamingowymi.",
"ALT_INDEX_HEADING": "Poradniki i porównania",
"ALT_INDEX_INTRO": "Jak KoalaSync wypada na tle innych narzędzi do watch party i rozwiązań streamingowych? Przeczytaj nasze uczciwe, techniczne porównania i wybierz najlepszą opcję na zdalne wieczory filmowe.",
"ALT_INDEX_READ_COMPARISON": "Przeczytaj porównanie →",
"ALT_INDEX_READ_GUIDE": "Przeczytaj poradnik →",
"ALT_INDEX_FOOTER_LINK": "Poradniki i porównania",
"ALT_TELEPARTY_TITLE": "KoalaSync czy Teleparty: którego narzędzia do wspólnego oglądania użyć?",
"ALT_TELEPARTY_META_DESC": "Praktyczne porównanie narzędzi KoalaSync i Teleparty pod kątem wspólnego oglądania: wbudowany czat, obsługa urządzeń mobilnych, synchronizacja wideo w przeglądarce, własne serwery multimediów i charakter open-source.",
"ALT_TELEPARTY_INTRO": "Zarówno KoalaSync, jak i Teleparty rozwiązują ten sam uciążliwy problem: jak oglądać coś wspólnie bez konieczności odliczania „3, 2, 1, start”. Różnią się jednak podejściem do tego zadania.<br><br>Teleparty sprawdza się najlepiej, jeśli zależy Ci na wbudowanym czacie lub oglądaniu na urządzeniach mobilnych. KoalaSync jest raczej rozwiązaniem do wspólnego oglądania w przeglądarce na komputerze gdy rozmawiacie już przez Discorda, Teamspeaka lub inny komunikator głosowy i chcecie jedynie zsynchronizować odtwarzanie.<br><br>Głównym powodem stworzenia KoalaSync była elastyczność. Narzędzie to ma współpracować z niemal każdą stroną wykorzystującą standardowy odtwarzacz wideo w przeglądarce, a nie tylko z wybraną listą platform. Obejmuje to własne serwery multimediów, takie jak Emby, Jellyfin czy Plex, domeny lokalne lub prywatne oraz wiele typowych stron z materiałami wideo.",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSync nie zastępuje rozmowy głosowej. Jeśli chcesz rozmawiać podczas oglądania, nadal możesz korzystać z Discorda, TeamSpeaka, Signala, WhatsAppa lub innych narzędzi, których używasz na co dzień.<br><br>Każda osoba musi również mieć dostęp do filmu lub strony na własnym urządzeniu. KoalaSync nie omija subskrypcji, konieczności logowania, zabezpieczeń DRM, ograniczeń regionalnych ani regulaminów platform.<br><br>Obecnie rozwiązanie to działa tylko w przeglądarkach na komputerach stacjonarnych i nie posiada wbudowanego czatu ani funkcji komunikacji głosowej, a kompatybilność zależy od używanej przeglądarki oraz odtwarzacza wideo.",
"ALT_SCREEN_SUMMARY_TITLE": "Podsumowanie",
"ALT_SCREEN_SUMMARY_BODY": "Udostępnianie ekranu to najprostsze rozwiązanie, gdy zależy Ci na szybkości, a kwestie jakości, prywatności czy indywidualnej kontroli nad odtwarzaniem nie są priorytetem. KoalaSync sprawdza się lepiej, gdy uczestnicy oglądają materiał lokalnie we własnych przeglądarkach, a sesja ma bardziej przypominać wspólny seans.",
"ALT_TRY_KOALASYNC": "Wypróbuj KoalaSync"
"ALT_W2G_TITLE": "KoalaSync vs Watch2Gether: Które rozwiązanie do oglądania filmów pasuje lepiej?",
"ALT_W2G_META_DESC": "Uczciwe porównanie między KoalaSync i Watch2Gether. Odkryj, kiedy elastyczność KoalaSync jest nie do pobicia i dlaczego Watch2Gether jest nadal najlepszym wyborem dla YouTube.",
"ALT_W2G_INTRO": "Zarówno KoalaSync, jak i Watch2Gether rozwiązują ten sam problem: oglądanie filmów zsynchronizowanych ze znajomymi online bez ręcznej koordynacji. Podczas gdy Watch2Gether jest jednym z najstarszych i najpopularniejszych ośrodków wspólnych wieczorów filmowych, KoalaSync przyjmuje zupełnie inne, lekkie podejście. To, które narzędzie będzie dla Ciebie odpowiednie, zależy w dużej mierze od tego, co i gdzie chcesz oglądać.",
"ALT_W2G_WHEN_W2G_TITLE": "Kiedy Watch2Gether jest lepszym wyborem",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether jest nie do pobicia w przypadku <strong>imprez oglądania w YouTube</strong>. Dzięki wbudowanej liście odtwarzania i wyszukiwaniu każdy w pomieszczeniu może z łatwością znajdować, dodawać i odtwarzać nowe filmy. Wszyscy płynnie oglądają wspólnie kolejny film.<br><br>Dzięki KoalaSync w YouTube przejmuje domyślną funkcję autoodtwarzania witryny, przekierowując każdego użytkownika do innego polecanego filmu. Nasza automatyczna funkcja następnego odcinka („Lobby odcinków”), która świetnie sprawdza się w serwisach Netflix i Disney+, nie działa w YouTube ze względu na te dynamiczne rekomendacje. Jeśli chcesz spędzić czas wyłącznie na YouTube, lepszym wyborem będzie Watch2Gether.",
"ALT_W2G_WHEN_KOALA_TITLE": "Kiedy KoalaSync lepiej pasuje",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync wyróżnia się <strong>prawdziwymi usługami przesyłania strumieniowego</strong> (Netflix, Prime Video, Disney+) i hostowanymi serwerami multimediów (Jellyfin, Plex, Emby). W przeciwieństwie do Watch2Gether, który często w ogóle nie może odtwarzać treści premium, KoalaSync synchronizuje natywny odtwarzacz bezpośrednio na stronie internetowej.<br><br>Działa na prawie każdej witrynie wyposażonej w standardowy odtwarzacz wideo HTML5. Nie musisz konfigurować wirtualnego pokoju na stronie trzeciej: po prostu aktywuj rozszerzenie, dołącz do lobby i zacznij oglądać.",
"ALT_W2G_MAIN_DIFF_TITLE": "Główna różnica",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether to <strong>samodzielna witryna</strong> z wbudowanym czatem, listami odtwarzania i obsługą kamery internetowej. KoalaSync to <strong>minimalistyczne rozszerzenie przeglądarki</strong>, które można podłączyć bezpośrednio do zwykłych kart przeglądarki.<br><br>Szukasz wszechstronnego pakietu dla YouTube z wbudowanym czatem? Użyj Watch2Gether. Chcesz oglądać filmy w serwisie Netflix lub na własnym serwerze bez zakłóceń, w natywnej jakości (bez kompresji serwerowej)? KoalaSync to czystsze rozwiązanie.",
"ALT_W2G_LIMITS_TITLE": "Uczciwe ograniczenia",
"ALT_W2G_LIMITS_BODY": "KoalaSync <strong>nie ma wbudowanych list odtwarzania ani wyszukiwania filmów</strong>. W YouTube oznacza to, że automatyczne odtwarzanie następnego filmu nie będzie zsynchronizowane.<br><br>Dodatkowo <strong>nie ma wbudowanego czatu</strong>, a KoalaSync działa obecnie tylko w przeglądarkach na komputerze. Został zaprojektowany przy założeniu, że i tak rozmawiasz przez Discord, Teamspeak lub inne narzędzia głosowe.",
"ALT_W2G_SUMMARY_TITLE": "Krótko mówiąc",
"ALT_W2G_SUMMARY_BODY": "W przypadku spontanicznych sesji YouTube z playlistami i wbudowanym czatem najlepszym wyborem będzie Watch2Gether. W przypadku platform do przesyłania strumieniowego premium (takich jak Netflix, Prime Video, Disney+), serwerów hostowanych samodzielnie (Jellyfin, Plex, Emby) i maksymalnej elastyczności przeglądarki, KoalaSync jest bardziej odpowiednim i lekkim narzędziem.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener: która platforma do oglądania filmów pasuje lepiej?",
"ALT_SCENER_META_DESC": "Uczciwe porównanie KoalaSync i Scener. Dowiedz się, kiedy wygrywa czat z kamerą internetową Scener i dlaczego KoalaSync jest najlepszy na wieczory filmowe pozbawione zakłóceń.",
"ALT_SCENER_INTRO": "KoalaSync i Scener pozwalają oglądać imprezy z dwóch zupełnie różnych perspektyw. Scener to wirtualne kino z wbudowanym czatem wideo i pokojami interaktywnymi. Z kolei KoalaSync to minimalistyczne, przyjazne dla prywatności rozszerzenie przeglądarki, które po prostu synchronizuje sterowanie odtwarzaniem. To, które narzędzie będzie dla Ciebie najbardziej odpowiednie, zależy głównie od tego, jak ważna jest dla Ciebie wbudowana kamera internetowa i funkcje czatu.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Kiedy Scener jest lepszym wyborem",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener to solidny wybór, jeśli potrzebujesz <strong>uniwersalnej platformy społecznościowej</strong> z wbudowanym czatem wideo i audio bezpośrednio w przeglądarce. Scener tworzy wirtualny pokój, w którym kamery internetowe gracza i znajomych są wyświetlane obok siebie. Jest to idealne rozwiązanie w przypadku dużych, publicznych imprez związanych z oglądaniem lub wirtualnych wydarzeń transmitowanych strumieniowo, gdzie aspekt społecznościowy jest na pierwszym miejscu. Należy jednak pamiętać, że bezpłatna wersja podstawowa obsługuje reklamy, a Scener blokuje wiele funkcji (takich jak oglądanie bez reklam i nieograniczone czaty wideo) w ramach miesięcznej subskrypcji (5,79 USD miesięcznie lub 39,99 USD rocznie).",
"ALT_SCENER_WHEN_KOALA_TITLE": "Kiedy KoalaSync lepiej pasuje",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync wyróżnia się <strong>jakością wideo, prywatnością i prostotą</strong>: <br><br> • <strong>Brak kont</strong>: nie musisz się rejestrować, logować ani zarządzać profilami. Po prostu aktywuj rozszerzenie, udostępnij kod pokoju i zacznij oglądać.<br> • <strong>Prawdziwa jakość natywna (4K/HDR)</strong>: Scener przesyła strumieniowo skompresowany obraz wideo z wirtualnego serwera w chmurze, co może prowadzić do utraty jakości i opóźnień. KoalaSync synchronizuje natywny odtwarzacz bezpośrednio na Twoim komputerze, co oznacza, że możesz oglądać filmy w pełnej rozdzielczości swojej subskrypcji strumieniowej.<br> • <strong>Niskie wykorzystanie przepustowości</strong>: Ponieważ przesyłane są tylko dane sterujące (odtwarzanie, pauza, znaczniki czasu), KoalaSync praktycznie nie wykorzystuje dodatkowej przepustowości. Scener przesyła strumieniowo cały obraz wideo i kamery przez serwery w chmurze, co może znacznie obciążać wolniejsze połączenia internetowe i starsze laptopy.<br> • <strong>100% za darmo i bez reklam</strong>: brak miesięcznych opłat abonamentowych, brak reklam i modułów śledzących.<br> • <strong>Lokalne pliki wideo</strong>: ponieważ KoalaSync działa lokalnie, możesz nawet oglądać własne pliki wideo (takie jak MP4) synchronizowane ze znajomymi. Po prostu przeciągnij i upuść plik na kartę przeglądarki Scener nie może tego zrobić, ponieważ jego odtwarzacz działa w chmurze.",
"ALT_SCENER_MAIN_DIFF_TITLE": "Główna różnica",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener to <strong>komercyjna sieć społecznościowa</strong> dla grup obserwujących, obsługiwana przez przeglądarki w wirtualnej chmurze i finansowana z reklam i miesięcznych subskrypcji. KoalaSync to <strong>bezpłatne narzędzie do synchronizacji, które dba o prywatność</strong>, które łączy się bezpośrednio z kartami przeglądarki. Pozostawia czat głosowy/wideo aplikacjom takim jak Discord lub Teamspeak, skupiając się całkowicie na zapewnieniu płynności odtwarzania, prywatności i oryginalnej jakości natywnej.",
"ALT_SCENER_LIMITS_TITLE": "Uczciwe ograniczenia",
"ALT_SCENER_LIMITS_BODY": "KoalaSync <strong>nie oferuje wbudowanego czatu ani obsługi kamery internetowej</strong>. Jest to wyłącznie narzędzie do synchronizacji i wymaga wybranego przez Ciebie osobnego narzędzia do połączeń głosowych. Ponadto KoalaSync jest obecnie dostępny tylko na komputerach stacjonarnych, a zgodność lokalnych plików wideo zależy całkowicie od tego, czy Twoja przeglądarka natywnie obsługuje odtwarzanie formatu wideo i kodeków audio.",
"ALT_SCENER_SUMMARY_TITLE": "Krótko mówiąc",
"ALT_SCENER_SUMMARY_BODY": "W przypadku dużych imprez oglądania z wbudowanym czatem kamery internetowej i funkcjami społecznościowymi Scener jest właściwym wyborem, pod warunkiem, że nie przeszkadzają Ci reklamy i płatne ściany premium. Jeśli chcesz korzystać z całkowicie darmowego, wolnego od reklam i zakłóceń doświadczenia w natywnym odtwarzaczu (w tym Netflix, Prime Video, Disney+ lub pliki lokalnej przeglądarki) i już prowadzisz połączenie głosowe, KoalaSync jest czystszym i wydajniejszym rozwiązaniem.",
"ALT_KOSMI_TITLE": "KoalaSync vs Kosmi: która alternatywa imprezy Netflix pasuje lepiej?",
"ALT_KOSMI_META_DESC": "Uczciwe porównanie KoalaSync i Kosmi. Dowiedz się, dlaczego konfiguracja Kosmi bez rozszerzenia jest wygodna i kiedy wygrywa natywna jakość wideo KoalaSync.",
"ALT_KOSMI_INTRO": "Zarówno KoalaSync, jak i Kosmi oferują świetne sposoby na synchronizację oglądania Netflix, YouTube i innych platform ze znajomymi. Jednak ich podstawowe technologie różnią się zasadniczo. Kosmi korzysta z przeglądarek w chmurze wirtualnej, które działają bezpośrednio w przeglądarce internetowej, bez konieczności instalowania rozszerzeń. KoalaSync to lekkie rozszerzenie, które synchronizuje lokalny odtwarzacz wideo. To, które podejście będzie dla Ciebie najbardziej odpowiednie, zależy od Twoich priorytetów dotyczących jakości wideo, wygody i prywatności.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Kiedy Kosmi jest lepszym wyborem",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi jest nie do pobicia, jeśli chcesz <strong>unikać instalowania czegokolwiek</strong> lub chcesz oglądać na urządzeniach takich jak tablety i smartfony. Ponieważ Kosmi uruchamia wirtualne przeglądarki w chmurze, aby dołączyć, wystarczy proste łącze internetowe. Co więcej, Kosmi to uniwersalna platforma do spotkań: oprócz zsynchronizowanego przesyłania strumieniowego, możesz grać w gry wieloosobowe (takie jak klasyki retro NES/SNES lub poker) oraz korzystać z wbudowanej kamery internetowej, czatu głosowego i tekstowego. Jeśli chcesz zorganizować wieczór gier towarzyskich i obejrzeć imprezę bez konfiguracji, Kosmi to fantastyczne rozwiązanie.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "Kiedy KoalaSync lepiej pasuje",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync wyróżnia się <strong>natywną jakością odtwarzania, bezpieczeństwem i wydajnością</strong>: <br><br> • <strong>Brak zagrożeń bezpieczeństwa</strong>: dzięki Kosmi musisz zalogować się do swojego konta Netflix lub Prime na zdalnym komputerze wirtualnym w chmurze. Dzięki KoalaSync logujesz się bezpiecznie na oficjalnej stronie przesyłania strumieniowego w swojej przeglądarce, tak jak zwykle. Twoje hasła nigdy nie opuszczają Twojego komputera.<br> • <strong>Pełna jakość wideo (4K/HDR)</strong>: Kosmi przesyła strumieniowo ekran wirtualnej przeglądarki jako skompresowany obraz wideo, co może powodować pikselację i buforowanie. KoalaSync synchronizuje natywne odtwarzacze lokalnie: możesz cieszyć się filmami w pełnej, krystalicznie czystej rozdzielczości swojej subskrypcji.<br> • <strong>Bez opóźnień i przyjazna przepustowość</strong>: Ponieważ KoalaSync wysyła tylko polecenia sterujące (odtwarzanie/pauza/znaczniki czasu), wykorzystuje prawie zerową przepustowość. Kosmi stale przesyła strumieniowo strumienie wideo HD, co może przeciążyć wolniejsze połączenia.<br> • <strong>Lokalne pliki wideo</strong>: jeśli chcesz obejrzeć prywatny film, po prostu przeciągnij i upuść plik MP4 na kartę przeglądarki i zsynchronizuj go. Kosmi nie może uzyskać dostępu do plików na lokalnym dysku twardym.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "Główna różnica",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi to <strong>wirtualne spotkanie w chmurze</strong>, które przesyła strumieniowo ekran zdalnej przeglądarki, dzięki czemu nikt nie musi instalować rozszerzenia. KoalaSync to <strong>lokalna warstwa synchronizacji przeglądarki</strong>, która łączy się bezpośrednio z natywnym odtwarzaczem na oficjalnej stronie przesyłania strumieniowego. Podczas gdy Kosmi jest bardziej wszechstronna pod względem minigier i kompatybilności z urządzeniami, KoalaSync oferuje bezpieczniejsze, płynniejsze i ostrzejsze przesyłanie strumieniowe w oryginalnym odtwarzaczu.",
"ALT_KOSMI_LIMITS_TITLE": "Uczciwe ograniczenia",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync <strong>wymaga zainstalowania rozszerzenia przeglądarki</strong> i obecnie działa tylko na komputerach stacjonarnych. <strong>Nie ma wbudowanego czatu ani kamer internetowych</strong>, ponieważ został zaprojektowany przy założeniu, że i tak rozmawiasz przez Discord lub inne narzędzia głosowe. Nie oferuje również wbudowanych gier.",
"ALT_KOSMI_SUMMARY_TITLE": "Krótko mówiąc",
"ALT_KOSMI_SUMMARY_BODY": "Na nieformalne wieczory z grami z klasykami w stylu retro i łatwym dostępem na urządzeniach mobilnych bez żadnej instalacji, Kosmi jest idealnym rozwiązaniem. W przypadku wieczorów filmowych premium w serwisach Netflix, Prime Video, Disney+ lub Plex w pełnej jakości 4K, przy maksymalnym bezpieczeństwie i minimalnym wpływie na przepustowość, KoalaSync jest wyraźnym zwycięzcą.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven: Które rozwiązanie do oglądania filmów pasuje lepiej?",
"ALT_TWOSEVEN_META_DESC": "Uczciwe porównanie KoalaSync i TwoSeven. Dowiedz się, kiedy wbudowana kamera internetowa TwoSeven wygrywa i dlaczego KoalaSync jest najlepszy dla Disney+ i Netflix.",
"ALT_TWOSEVEN_INTRO": "Zarówno KoalaSync, jak i TwoSeven stosują to samo podstawowe podejście do oglądania imprez: synchronizują oryginalny odtwarzacz wideo bezpośrednio w przeglądarce, zamiast przesyłać strumieniowo skompresowany strumień wideo z chmury. Zapewnia to najwyższą jakość wideo dla obu narzędzi. Jednakże, chociaż TwoSeven jest portalem komercyjnym z wbudowanym czatem z kamerą internetową i poziomami subskrypcji, KoalaSync pozostaje minimalistycznym, całkowicie darmowym i przyjaznym dla prywatności rozszerzeniem. Tutaj dowiesz się, która usługa najbardziej Ci odpowiada.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "Kiedy TwoSeven jest lepszym wyborem",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven to właściwy wybór, jeśli potrzebujesz <strong>kompleksowego rozwiązania ze zintegrowaną kamerą internetową i czatem audio</strong> bezpośrednio w przeglądarce. Jeśli chcesz widzieć swoich znajomych podczas oglądania, bez konieczności uruchamiania Discorda lub Teamspeaka w tle, TwoSeven oferuje tę integrację natywnie. Dodatkowo działa z YouTube i kilkoma otwartymi internetowymi odtwarzaczami wideo bez rozszerzeń. Jest odpowiedni dla małych grup składających się z 2 do 3 osób, które chcą dzielić połączenie wizualne podczas oglądania.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "Kiedy KoalaSync lepiej pasuje",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync wyróżnia się <strong>całkowitym brakiem opłat, prywatności i prostotą</strong>: <br><br> • <strong>Brak płatnych usług</strong>: aby oglądać usługi premium, takie jak Disney+ czy Hulu zsynchronizowane w TwoSeven, co najmniej jeden członek pokoju musi je wspierać na Patreonie (od 3 USD/miesiąc). KoalaSync synchronizuje Netflix, Prime Video, Disney+ i własne serwery multimediów (Jellyfin, Plex, Emby) w 100% bezpłatnie i bez ograniczeń.<br> • <strong>Absolutna prywatność (bez modułów śledzących/reklam)</strong>: TwoSeven obsługuje reklamy i korzysta z wielu modułów śledzących z Google, Facebooka i innych. KoalaSync nie zawiera reklam ani modułów śledzących i komunikuje się wyłącznie z serwerem przekazującym wyposażonym wyłącznie w pamięć RAM.<br> • <strong>Nie jest wymagana rejestracja</strong>: TwoSeven wymaga od wszystkich uczestników utworzenia konta i zalogowania się. KoalaSync jest całkowicie pozbawiony konta. Po prostu zainstaluj, wprowadź kod pokoju i zacznij oglądać.<br> • <strong>Lekki i przyjazny dla zasobów</strong>: Zintegrowana kamera internetowa TwoSeven i kanały audio mocno obciążają Twój procesor i sieć. Pozostawiając komunikację narzędziom takim jak Discord, KoalaSync działa niezwykle płynnie i oszczędza baterię.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "Główna różnica",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven to <strong>platforma komercyjna</strong> z wymogami rejestracyjnymi, reklamami, czatami przed kamerą internetową typu peer-to-peer i zaporami Patreon dla określonych usług przesyłania strumieniowego. KoalaSync to <strong>darmowe narzędzie o otwartym kodzie źródłowym</strong>, które łączy się bezpośrednio z kartami przeglądarki, bez konieczności zakładania kont, modułów śledzących i dodatkowych kosztów, umożliwiając oglądanie bez rozpraszania uwagi w natywnym odtwarzaczu.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Uczciwe ograniczenia",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync <strong>nie ma wbudowanej kamery internetowej ani czatu audio</strong> i zakłada, że prowadzisz już rozmowę za pośrednictwem Discorda lub podobnego narzędzia. Ponadto KoalaSync nie ma wbudowanej nakładki okna czatu i jest obecnie dostępny tylko na komputerze.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "Krótko mówiąc",
"ALT_TWOSEVEN_SUMMARY_BODY": "Dla małych grup składających się z dwóch lub trzech osób, które chcą widzieć się nawzajem za pośrednictwem kamer internetowych bezpośrednio w przeglądarce i nie mają nic przeciwko wspieraniu Patreona w ramach obsługi Disney+, TwoSeven jest fajną opcją. W przypadku wolnych od reklam, całkowicie bezpłatnych i prywatnych wieczorów filmowych w natywnej jakości 4K (Netflix, Prime Video, Disney+ lub Jellyfin) bez rejestracji, KoalaSync jest czystszym i bezpieczniejszym wyborem.",
"ALT_TRY_KOALASYNC": "Wypróbuj KoalaSync",
"MOCK_HOST_CONTROL_LABEL": "Kontrola hosta",
"MOCK_HOST_CONTROL_TOGGLE": "Tylko ja mogę sterować odtwarzaniem",
"LABEL_SELECT_VIDEO": "Wybierz wideo",
"OPTION_SELECT_TAB": "-- Wybierz kartę --",
"THEME_TOGGLE_LABEL": "Przełącz tryb jasny/ciemny",
"FAQ_SHOW_ALL": "Pokaż wszystkie pytania",
"FAQ_HIDE_ALL": "Ukryj pytania",
"SELF_SHOW_SETUP": "Pokaż instrukcję instalacji",
"SELF_HIDE_SETUP": "Ukryj instrukcję",
"HERO_TRUST": "Za darmo · Open source · Bez konta",
"COMP_MORE_GUIDES": "Pełne porównanie i więcej alternatyw"
}
+107 -27
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "pt_BR",
"META_TITLE": "KoalaSync | Sincronize Netflix, YouTube e qualquer vídeo com amigos",
"META_DESCRIPTION": "Assista Netflix, YouTube, Twitch e qualquer vídeo HTML5 em perfeita sincronia. Extensão de navegador gratuita e open source. Sem cadastro.",
"SCHEMA_APP_DESC": "Assista Netflix, YouTube, Twitch e qualquer vídeo HTML5 em perfeita sincronia. Extensão de navegador gratuita e open source. Sem cadastro.",
"OG_TITLE": "KoalaSync | Sincronize Netflix, Emby, Jellyfin e vídeos com amigos",
"OG_DESCRIPTION": "Assista a vídeos em perfeita sincronia com seus amigos. Extensão open source e focada em privacidade.",
"TWITTER_TITLE": "KoalaSync | Sincronize vídeos online com seus amigos",
"TWITTER_DESCRIPTION": "Assista a vídeos junto com seus amigos em sincronia perfeita. Open source e seguro.",
"META_TITLE": "KoalaSync | Watch party para Netflix, YouTube e mais",
"META_DESCRIPTION": "Watch party na Netflix, YouTube, Twitch e qualquer vídeo HTML5. Extensão gratuita e open source para Chrome e Firefox. Sem conta, sem rastreamento, sem anúncios.",
"SCHEMA_APP_DESC": "Watch party na Netflix, YouTube, Twitch e qualquer vídeo HTML5. Extensão gratuita e open source para Chrome e Firefox. Sem conta, sem rastreamento, sem anúncios.",
"OG_TITLE": "KoalaSync | Watch party para Netflix, Emby, Jellyfin e quase qualquer vídeo",
"OG_DESCRIPTION": "Crie uma watch party na Netflix, Emby, Jellyfin, YouTube, Twitch e quase qualquer vídeo HTML5. Open source, privado e sem conta.",
"TWITTER_TITLE": "KoalaSync | Watch party para Netflix, Emby, Jellyfin e quase qualquer vídeo Extensão",
"TWITTER_DESCRIPTION": "Crie uma watch party na Netflix, Emby, Jellyfin, YouTube, Twitch e quase qualquer vídeo HTML5. Open source, privado e sem conta.",
"NAV_FEATURES": "Recursos",
"NAV_HOW_IT_WORKS": "Como Funciona",
"HERO_TITLE": "Assistam Juntos.<span class='hero-line2'>Sincronia Perfeita.</span>",
"HERO_SUBTITLE": "Sua noite de cinema à distância sem atrasos. Sem contas, sem coleta de dados. Apenas compartilhe o link e assistam juntos.",
"HERO_TITLE": "Transforme qualquer vídeo em uma <span class='hero-highlight'>watch party</span>.",
"HERO_SUBTITLE": "Sua sessão de cinema à distância, sem atrasos. Sem conta, sem rastreamento, sem anúncios. Compartilhe um link e deem play juntos.",
"HERO_MASCOT_ALT": "Um coala fofo olhando para os botões de download",
"DEMO_SYNC": "Sincronizado",
"DEMO_HINT": "Demo ao vivo: dê play em qualquer aba e o KoalaSync mantém as duas em sincronia.",
"DEMO_NO_ROOM": "Ainda não conectado",
"DEMO_CREATE_ROOM": "Criar sala",
"DEMO_JOINED": "Entrou na sala",
"DEMO_TAB_SELECTED": "Aba selecionada",
"DEMO_SELECT_PLACEHOLDER": "Escolha uma aba de vídeo…",
"MOBILE_DEMO_CTA": "Ver como funciona",
"MOBILE_DEMO_TITLE": "Demo ao vivo do KoalaSync",
"MOBILE_DEMO_CLOSE": "Fechar demo",
"ADD_TO_CHROME": "Adicionar ao Chrome",
"ADD_TO_FIREFOX": "Adicionar ao Firefox",
"COMPAT_HEADING": "Funciona nas suas plataformas favoritas",
@@ -35,20 +45,20 @@
"USE_CASE_3_DESC": "Aproveite as noites a dois. Ria das mesmas piadas e sinta as mesmas emoções exatamente no mesmo segundo.",
"WHY_TITLE": "Por que o KoalaSync?",
"WHY_SUBTITLE": "Sincronização confiável, máxima privacidade e uso simples.",
"FEATURE_1_TITLE": "Controle Total / Sincronia Instantânea",
"FEATURE_1_DESC": "Se um pausa, todos pausam. Se um avança, todos seguem. Sincronização em tempo real para todos os participantes.",
"FEATURE_1_TITLE": "Controle do host e sincronização",
"FEATURE_1_DESC": "Você decide quem controla a reprodução. Ative o controle do anfitrião para que apenas você possa pausar e avançar, ou nomeie coanfitriões.",
"FEATURE_2_TITLE": "Maratonas Sem Interrupções",
"FEATURE_2_DESC": "O KoalaSync detecta a mudança de episódios e pausa automaticamente até que todos tenham carregado o vídeo seguinte.",
"FEATURE_3_TITLE": "Sem Contas / Privacidade Absoluta",
"FEATURE_3_DESC": "Sem cadastros ou rastreio. O servidor roda apenas na RAM e apaga sua sala assim que você sai.",
"FEATURE_4_TITLE": "Suporte HTML5 Universal",
"FEATURE_4_DESC": "Funciona no YouTube, Twitch, Netflix, Jellyfin, Emby e em qualquer site web. Nenhum dado de vídeo é enviado a nós.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby e quase qualquer página com vídeo HTML5. Só saem os sinais de sincronização, nunca o vídeo.",
"FEATURE_5_TITLE": "Servidores Próprios (Docker)",
"FEATURE_5_DESC": "Nossos servidores são gratuitos, mas você pode assumir o controle total e iniciar seu próprio servidor privado em segundos com Docker.",
"FEATURE_6_TITLE": "Convites Rápidos / Entrar com 1 Clique",
"FEATURE_6_DESC": "Chega de senhas complicadas. Compartilhe o link e seus amigos entram na sala automaticamente.",
"FEATURE_7_TITLE": "Compressor de Áudio Integrado",
"FEATURE_7_DESC": "O compressor de áudio reforça diálogos baixos e diminui o volume de explosões. Funciona localmente, nenhum áudio sai do seu computador.",
"FEATURE_7_DESC": "Nunca mais mexer no volume. Um compressor integrado realça diálogos baixos e suaviza explosões altas, tudo processado localmente no seu navegador.",
"FEATURE_8_TITLE": "Open Source (Licença MIT)",
"FEATURE_8_DESC": "Todo o código é público no GitHub. 100% de transparência, sem softwares ocultos.",
"COMP_TITLE": "KoalaSync vs Teleparty",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Políticas de privacidade do Teleparty:",
"COMP_FOOTNOTE_4": "Funciona em sites que permitem injeção de scripts. Plataformas com DRM estrito podem ter limitações.",
"STEPS_TITLE": "Como Começar",
"STEP_1_TITLE": "Instalar a Extensão",
"STEP_1_DESC": "Adicione o KoalaSync ao seu navegador (Chrome ou Firefox).",
"STEP_1_ILLUS_DESC": "Extensão segura para ver vídeos",
"STEP_1_ILLUS_DL_CHROME": "Baixar para Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Baixar para Firefox",
"STEP_1_ILLUS_ACTIVE": "Extensão Ativa",
"STEP_1_ILLUS_READY": "Pronto!",
"STEP_2_TITLE": "Criar uma Sala",
"STEP_2_DESC": "Abra a extensão e clique em '+ Criar nova sala'. O link de convite é copiado automaticamente.",
"STEP_1_TITLE": "Criar e compartilhar a sala",
"STEP_1_DESC": "Abra a extensão, crie uma sala com um clique e compartilhe o link com seus amigos. Eles entram instantaneamente pelo link de convite.",
"STEP_1_ILLUS_DESC": "Escolha uma guia para vincular",
"STEP_1_ILLUS_DL_CHROME": "Vincular guia do YouTube",
"STEP_1_ILLUS_DL_FIREFOX": "Vincular guia do Netflix",
"STEP_1_ILLUS_ACTIVE": "Guia vinculada",
"STEP_1_ILLUS_READY": "Pronto para ver em sincronia !",
"STEP_2_TITLE": "Selecionar a guia do vídeo",
"STEP_2_DESC": "Acesse a guia do seu vídeo e selecione-a no menu da extensão. O KoalaSync vincula seus reprodutores automaticamente.",
"STEP_2_ILLUS_ROOM": "Sala",
"STEP_2_ILLUS_SYNC": "Sincronia",
"STEP_2_ILLUS_SETTINGS": "Configurações",
"STEP_2_ILLUS_CREATE": "+ Criar nova sala",
"STEP_2_ILLUS_MANUAL": "Manual / Avançado",
"STEP_2_ILLUS_COPIED": "Link copiado!",
"STEP_3_TITLE": "Compartilhar e Assistir",
"STEP_3_DESC": "Envie o link aos amigos. Escolha um vídeo e aproveitem juntos.",
"STEP_3_TITLE": "Aproveitar a sincronização",
"STEP_3_DESC": "Inicie a reprodução. Se alguém pausar, avançar ou reproduzir, o vídeo de todos se mantém sincronizado em tempo real e sem atrasos.",
"STEP_3_ILLUS_IN_SYNC": "SINCRONIZADOS",
"SELF_TITLE": "Para usuários avançados",
"SELF_SUBTITLE": "Prefere gerenciar seus próprios dados? Inicie seu próprio servidor em minutos com Docker.",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SINCRO",
"MOCK_14": "Ir para a posição dos outros",
"MOCK_15": "Última Atividade",
"MOCK_16": "Aguardando 1 amigo (KoalaPC)...",
"MOCK_16": "Aguardando 1 amigo (🐶 HappyDog)...",
"MOCK_17": "Pular e reproduzir agora",
"MOCK_18": "Seu Nome",
"MOCK_19": "Ocultar abas sem vídeo",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync não é afiliado à Netflix, Disney+, YouTube, Twitch, etc. Todas as marcas registradas são de propriedade de seus respectivos donos.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync - Alternativas e comparações",
"ALT_INDEX_META_DESC": "Explore comparações honestas e guias detalhados entre o KoalaSync e outras extensões de watch party e soluções de streaming.",
"ALT_INDEX_HEADING": "Guias e comparações",
"ALT_INDEX_INTRO": "Como o KoalaSync se compara a outras ferramentas de watch party e soluções de streaming? Leia nossas comparações honestas e técnicas para encontrar a melhor opção para suas noites de cinema à distância.",
"ALT_INDEX_READ_COMPARISON": "Ler comparação →",
"ALT_INDEX_READ_GUIDE": "Ler guia →",
"ALT_INDEX_FOOTER_LINK": "Guias e comparações",
"ALT_TELEPARTY_TITLE": "KoalaSync vs. Teleparty: qual ferramenta de watch party você deve usar?",
"ALT_TELEPARTY_META_DESC": "Uma comparação prática entre KoalaSync e Teleparty para watch parties, abordando chat integrado, suporte para dispositivos móveis, sincronização de vídeo no navegador, servidores de mídia hospedados pelo próprio usuário e uso de código aberto.",
"ALT_TELEPARTY_INTRO": "Tanto o KoalaSync quanto o Teleparty ajudam a resolver o mesmo problema incômodo: assistir a algo em conjunto sem precisar daquela rotina de \"3, 2, 1, play\". A diferença é a abordagem que cada um utiliza.<br><br>O Teleparty é a opção mais indicada se você deseja um chat integrado ou quer assistir pelo celular. O KoalaSync é mais voltado para watch parties em navegadores de desktop, onde você já conversa via Discord, Teamspeak ou outra chamada de voz e só precisa que a reprodução do vídeo permaneça sincronizada.<br><br>O principal motivo pelo qual criei o KoalaSync foi a flexibilidade. Ele foi projetado para funcionar com praticamente qualquer site que utilize um reprodutor de vídeo padrão de navegador, e não apenas com uma lista fixa de plataformas. Isso inclui sistemas hospedados pelo próprio usuário, como Emby, Jellyfin e Plex, domínios locais ou privados e muitas páginas de vídeo comuns na web.",
@@ -191,7 +208,7 @@
"ALT_TELEPARTY_LIMITS_TITLE": "Limitações reais",
"ALT_TELEPARTY_LIMITS_BODY": "O KoalaSync não faz mágica e não tenta esconder suas limitações. Atualmente, ele funciona apenas em navegadores para desktop. Não possui chat integrado nem aplicativo para dispositivos móveis.<br><br>A compatibilidade também depende do navegador e do reprodutor de vídeo utilizado. O KoalaSync deve funcionar com praticamente qualquer reprodutor de vídeo padrão de navegador, mas os sites podem alterar seus reprodutores, o comportamento de DRM ou as restrições do navegador a qualquer momento.<br><br>O KoalaSync não tem vínculo com Netflix, Disney+, Prime Video, YouTube, Teleparty, Emby, Jellyfin, Plex ou qualquer outra marca mencionada aqui. Os nomes são utilizados apenas para ilustrar casos de uso comuns.",
"ALT_TELEPARTY_SUMMARY_TITLE": "Resumo",
"ALT_TELEPARTY_SUMMARY_BODY": "Se você busca chat integrado ou suporte para dispositivos móveis, o Teleparty pode ser a melhor opção. Se você prefere uma solução gratuita e de código aberto para sincronização em navegadores de desktop que funcione com praticamente qualquer reprodutor de vídeo comum, incluindo servidores de mídia auto-hospedados como Emby, Jellyfin e Plex, o KoalaSync é provavelmente a escolha ideal.",
"ALT_TELEPARTY_SUMMARY_BODY": "Se você busca chat integrado ou suporte para dispositivos móveis, o Teleparty pode ser a melhor opção. Se você prefere uma solução gratuita e de código aberto para sincronização em navegadores de desktop, que funcione com praticamente qualquer reprodutor de vídeo comum, incluindo servidores de mídia auto-hospedados como Emby, Jellyfin e Plex, o KoalaSync é provavelmente a escolha ideal.",
"ALT_SCREEN_TITLE": "KoalaSync vs. compartilhamento de tela: quando a sincronização de vídeo é melhor?",
"ALT_SCREEN_META_DESC": "Uma comparação prática entre o KoalaSync e o compartilhamento de tela para sessões de cinema remotas, abordando controle de reprodução, qualidade de vídeo, privacidade, legendas e visualização via navegador.",
"ALT_SCREEN_INTRO": "O compartilhamento de tela funciona e, honestamente, às vezes é o suficiente. Uma pessoa compartilha a tela, as outras assistem e pronto.<br><br>Mas, para sessões de cinema mais longas ou para assistir a episódios em conjunto, isso pode se tornar incômodo. A qualidade do vídeo depende da velocidade de upload, da CPU e do navegador de quem está compartilhando, além da compressão aplicada por aplicativos como Discord, Teamspeak, Zoom ou outros. Além disso, apenas uma pessoa realmente controla a reprodução.",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "O KoalaSync não substitui uma chamada de voz. Se você quiser conversar enquanto assiste, continue usando Discord, Teamspeak, Signal, WhatsApp ou qualquer ferramenta que utilize normalmente.<br><br>Todos também precisam ter acesso ao vídeo ou à página em seus próprios dispositivos. O KoalaSync não contorna assinaturas, logins, DRM, restrições regionais ou regras da plataforma.<br><br>Atualmente, funciona apenas em navegadores para desktop, não possui recursos integrados de chat ou voz, e a compatibilidade depende sempre do navegador e do reprodutor de vídeo.",
"ALT_SCREEN_SUMMARY_TITLE": "Resumo",
"ALT_SCREEN_SUMMARY_BODY": "O compartilhamento de tela é a opção mais simples quando você quer algo rápido e não se preocupa muito com qualidade, privacidade ou controle individual. O KoalaSync é mais adequado quando todos devem assistir localmente em seus próprios navegadores e a sessão deve proporcionar uma experiência mais próxima de realmente assistir juntos.",
"ALT_TRY_KOALASYNC": "Experimente o KoalaSync"
"ALT_W2G_TITLE": "KoalaSync vs Watch2Gether: Qual solução de watch party se adapta melhor?",
"ALT_W2G_META_DESC": "Uma comparação honesta entre KoalaSync e Watch2Gether. Descubra quando a flexibilidade do KoalaSync é imbatível e por que o Watch2Gether ainda é a melhor escolha para o YouTube.",
"ALT_W2G_INTRO": "KoalaSync e Watch2Gether resolvem o mesmo problema: assistir vídeos sincronizados com amigos online sem coordenação manual. Embora Watch2Gether seja um dos centros mais antigos e populares para noites de cinema compartilhadas, o KoalaSync adota uma abordagem leve e completamente diferente. A ferramenta certa para você depende muito do que e onde você deseja assistir.",
"ALT_W2G_WHEN_W2G_TITLE": "Quando Watch2Gether é a melhor escolha",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether é imbatível para <strong>festas de exibição do YouTube</strong>. Com sua lista de reprodução e pesquisa integradas, qualquer pessoa na sala pode facilmente encontrar, adicionar e reproduzir novos vídeos. Todos assistem ao próximo vídeo juntos sem problemas.<br><br>Com o KoalaSync no YouTube, a reprodução automática padrão do site assume o controle, redirecionando cada usuário para um vídeo recomendado diferente. Nosso recurso automático de próximo episódio (“Episode Lobby”), que funciona muito bem no Netflix ou Disney+, não funciona no YouTube devido a essas recomendações dinâmicas. Para noites puras no YouTube, Watch2Gether é a melhor escolha.",
"ALT_W2G_WHEN_KOALA_TITLE": "Quando o KoalaSync se ajusta melhor",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync brilha em <strong>serviços reais de streaming</strong> (Netflix, Prime Video, Disney+) e servidores de mídia auto-hospedados (Jellyfin, Plex, Emby). Ao contrário do Watch2Gether, que muitas vezes não consegue reproduzir conteúdo premium, o KoalaSync sincroniza o player nativo diretamente no site.<br><br>Ele funciona em quase todos os sites com um player de vídeo HTML5 padrão. Você não precisa configurar uma sala virtual em um site de terceiros: basta ativar a extensão, entrar em um lobby e começar a assistir.",
"ALT_W2G_MAIN_DIFF_TITLE": "A principal diferença",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether é um <strong>site independente</strong> com chat integrado, listas de reprodução e suporte para webcam. KoalaSync é uma <strong>extensão de navegador minimalista</strong> que se conecta diretamente às guias normais do navegador.<br><br>Procurando um pacote completo para o YouTube com bate-papo integrado? Use Watch2Gether. Quer assistir filmes na Netflix ou no seu próprio servidor sem distrações, em qualidade nativa (sem compactação do servidor)? KoalaSync é a solução mais limpa.",
"ALT_W2G_LIMITS_TITLE": "Limitações honestas",
"ALT_W2G_LIMITS_BODY": "KoalaSync <strong>não possui listas de reprodução integradas ou pesquisa de vídeos</strong>. No YouTube, isso significa que a reprodução automática do próximo vídeo não permanecerá sincronizada.<br><br>Além disso, <strong>não há bate-papo integrado</strong>, e o KoalaSync atualmente só funciona em navegadores de desktop. Ele foi projetado partindo do pressuposto de que você já está falando via Discord, Teamspeak ou outras ferramentas de voz.",
"ALT_W2G_SUMMARY_TITLE": "Resumidamente",
"ALT_W2G_SUMMARY_BODY": "Para sessões espontâneas no YouTube com playlists e chat integrado, Watch2Gether é a melhor escolha. Para plataformas de streaming premium (como Netflix, Prime Video, Disney+), servidores auto-hospedados (Jellyfin, Plex, Emby) e flexibilidade máxima do navegador, KoalaSync é a ferramenta mais adequada e leve.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener: Qual plataforma de watch party se adapta melhor?",
"ALT_SCENER_META_DESC": "Uma comparação honesta entre KoalaSync e Scener. Descubra quando o bate-papo na webcam do Scener vence e por que o KoalaSync é melhor para noites de cinema sem distrações.",
"ALT_SCENER_INTRO": "KoalaSync e Scener abordam festas de dois ângulos completamente diferentes. Scener é uma sala de cinema virtual com chat de vídeo integrado e salas interativas. KoalaSync, por outro lado, é uma extensão de navegador minimalista e amigável à privacidade que simplesmente sincroniza os controles de reprodução. A ferramenta mais adequada para você depende principalmente da importância dos recursos integrados de webcam e bate-papo para você.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Quando Scener é a melhor escolha",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener é uma escolha sólida se você deseja uma <strong>plataforma social completa</strong> com bate-papo por vídeo e áudio integrado diretamente em seu navegador. O Scener cria uma sala virtual onde as webcams do jogador e dos seus amigos são exibidas lado a lado. Isso é ideal para grandes festas públicas ou eventos de streaming virtual onde o aspecto social é o centro das atenções. No entanto, lembre-se de que a versão básica gratuita é suportada por anúncios e o Scener bloqueia muitos recursos (como visualização sem anúncios e chat de vídeo ilimitado) por meio de uma assinatura mensal (US$ 5,79/mês ou US$ 39,99/ano).",
"ALT_SCENER_WHEN_KOALA_TITLE": "Quando o KoalaSync se ajusta melhor",
"ALT_SCENER_WHEN_KOALA_BODY": "O KoalaSync brilha quando se trata de <strong>qualidade, privacidade e simplicidade de vídeo</strong>:<br><br>• <strong>Sem contas</strong>: você não precisa se registrar, fazer login ou gerenciar perfis. Basta ativar a extensão, compartilhar um código de sala e começar a assistir.<br>• <strong>Qualidade nativa real (4K/HDR)</strong>: o Scener transmite vídeo compactado de um servidor virtual em nuvem, o que pode levar à perda de qualidade e atrasos. O KoalaSync sincroniza o player nativo diretamente no seu computador, o que significa que você assiste filmes na resolução total da sua assinatura de streaming.<br>• <strong>Baixo uso de largura de banda</strong>: como apenas dados de controle (reprodução, pausa, registros de data e hora) são transmitidos, o KoalaSync praticamente não usa largura de banda extra. O Scener transmite todos os feeds de vídeo e câmera por meio de servidores em nuvem, o que pode sobrecarregar muito conexões de Internet mais lentas e laptops mais antigos.<br>• <strong>100% gratuito e sem anúncios</strong>: sem taxas de assinatura mensal, sem anúncios e sem rastreadores.<br>• <strong>Arquivos de vídeo locais</strong>: como o KoalaSync é executado localmente, você pode até assistir seus próprios arquivos de vídeo (como MP4) em sincronia com amigos. Basta arrastar e soltar o arquivo em uma guia do navegador o Scener não pode fazer isso porque seu player roda na nuvem.",
"ALT_SCENER_MAIN_DIFF_TITLE": "A principal diferença",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener é uma <strong>rede social comercial</strong> para assistir festas que é alimentada por navegadores virtuais em nuvem e financiada por anúncios e assinaturas mensais. KoalaSync é um <strong>utilitário de sincronização gratuito e com foco na privacidade</strong> que se conecta diretamente às guias do seu navegador. Ele deixa o bate-papo por voz/vídeo para aplicativos como Discord ou Teamspeak, concentrando-se inteiramente em manter sua reprodução fluida, privada e em sua qualidade original nativa.",
"ALT_SCENER_LIMITS_TITLE": "Limitações honestas",
"ALT_SCENER_LIMITS_BODY": "KoalaSync <strong>não oferece suporte integrado para chat ou webcam</strong>. É puramente uma ferramenta de sincronização e requer uma ferramenta de chamada de voz separada de sua escolha. Além disso, o KoalaSync atualmente é apenas para desktop, e a compatibilidade do arquivo de vídeo local depende inteiramente se o seu navegador suporta nativamente a reprodução do formato de vídeo e codecs de áudio.",
"ALT_SCENER_SUMMARY_TITLE": "Resumidamente",
"ALT_SCENER_SUMMARY_BODY": "Para grandes grupos de observação com bate-papo na webcam integrado e recursos sociais, o Scener é a escolha certa, desde que você não se importe com anúncios e acessos pagos premium. Se você deseja uma experiência totalmente gratuita, sem anúncios e sem distrações no player nativo (incluindo Netflix, Prime Video, Disney+ ou arquivos de navegador local) e já está em uma chamada de voz, o KoalaSync é a solução mais limpa e com melhor desempenho.",
"ALT_KOSMI_TITLE": "KoalaSync vs Kosmi: Qual alternativa de festa da Netflix se adapta melhor?",
"ALT_KOSMI_META_DESC": "Uma comparação honesta entre KoalaSync e Kosmi. Descubra por que a configuração sem extensão do Kosmi é conveniente e quando a qualidade de vídeo nativa do KoalaSync vence.",
"ALT_KOSMI_INTRO": "Tanto o KoalaSync quanto o Kosmi oferecem ótimas maneiras de assistir Netflix, YouTube e outras plataformas em sincronia com amigos. No entanto, as suas tecnologias subjacentes são fundamentalmente diferentes. Kosmi usa navegadores virtuais em nuvem que são executados diretamente em seu navegador sem instalar extensões. KoalaSync é uma extensão leve que sincroniza seu player de vídeo local. A abordagem mais adequada para você depende de suas prioridades em relação à qualidade, conveniência e privacidade do vídeo.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Quando Kosmi é a melhor escolha",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi é imbatível se você quiser <strong>evitar instalar qualquer coisa</strong> ou quiser assistir em dispositivos como tablets e smartphones. Como o Kosmi executa navegadores virtuais na nuvem, basta um simples link da web para ingressar. Além disso, Kosmi é uma plataforma de hangout completa: além do streaming sincronizado, você pode jogar jogos multijogador (como clássicos retrô do NES/SNES ou pôquer) e usar a webcam integrada, bate-papo por voz e texto. Se você quer uma noite de jogos sociais e assistir a uma festa sem configuração, Kosmi é uma solução fantástica.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "Quando o KoalaSync se ajusta melhor",
"ALT_KOSMI_WHEN_KOALA_BODY": "O KoalaSync brilha quando se trata de <strong>qualidade de reprodução, segurança e desempenho nativos</strong>:<br><br>• <strong>Sem riscos de segurança</strong>: com o Kosmi, você precisa fazer login na sua conta Netflix ou Prime em um computador virtual remoto na nuvem. Com o KoalaSync, você faz login com segurança no site oficial de streaming em seu próprio navegador, como faria normalmente. Suas senhas nunca saem da sua máquina.<br>• <strong>Qualidade total de vídeo (4K/HDR)</strong>: o Kosmi transmite a tela do navegador virtual como um feed de vídeo compactado, o que pode resultar em pixelização e buffer. O KoalaSync sincroniza os players nativos localmente: você desfruta de filmes na resolução completa e nítida da sua assinatura.<br>• <strong>Sem atraso e compatível com largura de banda</strong>: como o KoalaSync envia apenas comandos de controle (reproduzir/pausar/carimbos de data/hora), ele usa quase zero largura de banda. Kosmi transmite constantemente feeds de vídeo em HD, o que pode sobrecarregar conexões mais lentas.<br>• <strong>Arquivos de vídeo locais</strong>: se quiser assistir a um vídeo privado, basta arrastar e soltar o arquivo MP4 em uma guia do navegador e sincronizá-lo. Kosmi não pode acessar arquivos em seu disco rígido local.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "A principal diferença",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi é um <strong>ponto de encontro virtual na nuvem</strong> que transmite a tela de um navegador remoto para que ninguém precise instalar uma extensão. KoalaSync é uma <strong>camada de sincronização local do navegador</strong> que se conecta diretamente ao player nativo no site oficial de streaming. Embora o Kosmi seja mais versátil para minijogos e compatibilidade de dispositivos, o KoalaSync oferece uma experiência de streaming mais segura, fluida e nítida no player original.",
"ALT_KOSMI_LIMITS_TITLE": "Limitações honestas",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync <strong>requer a instalação de uma extensão de navegador</strong> e atualmente só funciona em PCs desktop. Ele <strong>não possui bate-papo ou webcams integrados</strong>, pois foi projetado sob a suposição de que você já está conversando via Discord ou outras ferramentas de voz. Também não oferece jogos integrados.",
"ALT_KOSMI_SUMMARY_TITLE": "Resumidamente",
"ALT_KOSMI_SUMMARY_BODY": "Para noites de jogos casuais com clássicos retrô e fácil acesso em dispositivos móveis sem qualquer instalação, o Kosmi é ideal. Para noites de cinema premium no Netflix, Prime Video, Disney+ ou Plex em qualidade 4K total, com segurança máxima e impacto mínimo na largura de banda, o KoalaSync é o vencedor claro.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven: Qual solução de watch party se adapta melhor?",
"ALT_TWOSEVEN_META_DESC": "Uma comparação honesta entre KoalaSync e TwoSeven. Descubra quando a webcam integrada do TwoSeven vence e por que o KoalaSync é melhor para Disney+ e Netflix.",
"ALT_TWOSEVEN_INTRO": "Tanto o KoalaSync quanto o TwoSeven usam a mesma abordagem básica para assistir grupos: eles sincronizam o player de vídeo original diretamente no seu navegador, em vez de transmitir um feed de vídeo compactado da nuvem. Isso garante qualidade de vídeo de alto nível para ambas as ferramentas. No entanto, embora o TwoSeven seja um portal comercial com chat de webcam integrado e níveis de assinatura, o KoalaSync continua sendo uma extensão minimalista, totalmente gratuita e com privacidade. Descubra aqui qual serviço se adapta melhor a você.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "Quando TwoSeven é a melhor escolha",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven é a escolha certa se você deseja uma <strong>solução completa com webcam integrada e chat de áudio</strong> diretamente no seu navegador. Se você quiser ver seus amigos enquanto assiste sem precisar rodar o Discord ou Teamspeak em segundo plano, o TwoSeven oferece essa integração de forma nativa. Além disso, funciona para o YouTube e alguns players de vídeo da web abertos sem extensões. É adequado para pequenos grupos de 2 a 3 pessoas que desejam compartilhar uma conexão visual durante a visualização.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "Quando o KoalaSync se ajusta melhor",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync brilha com sua <strong>total falta de taxas, privacidade e simplicidade</strong>:<br><br>• <strong>Sem paywalls</strong>: para assistir serviços premium como Disney+ ou Hulu sincronizados no TwoSeven, pelo menos um membro da sala deve apoiá-los no Patreon (a partir de US$ 3/mês). KoalaSync sincroniza Netflix, Prime Video, Disney+ e servidores de mídia auto-hospedados (Jellyfin, Plex, Emby) 100% grátis e sem restrições.<br>• <strong>Privacidade absoluta (sem rastreadores/anúncios)</strong>: TwoSeven é suportado por anúncios e usa vários rastreadores do Google, Facebook e outros. O KoalaSync não tem anúncios nem rastreadores e se comunica exclusivamente com o servidor de retransmissão somente RAM.<br>• <strong>Não é necessário registro</strong>: o TwoSeven exige que todos os participantes criem uma conta e façam login. O KoalaSync é totalmente gratuito. Basta instalar, inserir um código de sala e começar a assistir.<br>• <strong>Leve e com poucos recursos</strong>: a webcam integrada e os feeds de áudio do TwoSeven sobrecarregam sua CPU e sua rede. Ao deixar a comunicação para ferramentas como o Discord, o KoalaSync funciona de forma extremamente suave e preserva a vida útil da bateria.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "A principal diferença",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven é uma <strong>plataforma comercial</strong> com requisitos de registro, anúncios, chats peer-to-peer por webcam e paywalls do Patreon para serviços de streaming específicos. KoalaSync é um <strong>utilitário gratuito e de código aberto</strong> que se conecta diretamente às guias do seu navegador sem contas, rastreadores ou custos extras, permitindo assistir sem distrações no player nativo.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Limitações honestas",
"ALT_TWOSEVEN_LIMITS_BODY": "O KoalaSync <strong>não oferece webcam integrada ou bate-papo com áudio</strong> e pressupõe que você já esteja em uma chamada via Discord ou ferramenta semelhante. Além disso, o KoalaSync não possui sobreposição de caixa de bate-papo integrada e atualmente é apenas para desktop.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "Resumidamente",
"ALT_TWOSEVEN_SUMMARY_BODY": "Para pequenos grupos de duas ou três pessoas que desejam se ver através de webcams diretamente no navegador e não se importam em apoiar um Patreon para suporte Disney +, TwoSeven é uma boa opção. Para noites de cinema privadas, totalmente gratuitas e sem anúncios em qualidade 4K nativa (seja Netflix, Prime Video, Disney+ ou Jellyfin) sem registros, o KoalaSync é a escolha mais limpa e segura.",
"ALT_TRY_KOALASYNC": "Experimente o KoalaSync",
"MOCK_HOST_CONTROL_LABEL": "Controle do anfitrião",
"MOCK_HOST_CONTROL_TOGGLE": "Apenas eu posso controlar a reprodução",
"LABEL_SELECT_VIDEO": "Selecionar vídeo",
"OPTION_SELECT_TAB": "-- Selecione uma aba --",
"THEME_TOGGLE_LABEL": "Alternar modo claro/escuro",
"FAQ_SHOW_ALL": "Mostrar todas as perguntas",
"FAQ_HIDE_ALL": "Ocultar perguntas",
"SELF_SHOW_SETUP": "Mostrar guia de configuração",
"SELF_HIDE_SETUP": "Ocultar guia",
"HERO_TRUST": "Grátis · Código aberto · Sem conta",
"COMP_MORE_GUIDES": "Comparação completa e mais alternativas"
}
+106 -26
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "pt_PT",
"META_TITLE": "KoalaSync | Sincronize Netflix, YouTube e vídeos com os amigos",
"META_DESCRIPTION": "Veja Netflix, YouTube, Twitch e qualquer vídeo HTML5 em sincronia perfeita. Extensão gratuita e de código aberto. Sem registo.",
"SCHEMA_APP_DESC": "Veja Netflix, YouTube, Twitch e qualquer vídeo HTML5 em sincronia perfeita. Extensão gratuita e de código aberto. Sem registo.",
"OG_TITLE": "KoalaSync | Sincronize Netflix, Emby, Jellyfin e vídeos com os amigos",
"OG_DESCRIPTION": "Veja vídeos em sincronia perfeita com os amigos. Extensão de código aberto e focada na privacidade.",
"TWITTER_TITLE": "KoalaSync | Sincronize vídeos em streaming com os amigos",
"TWITTER_DESCRIPTION": "Veja vídeos com os amigos em sincronia perfeita. Extensão de código aberto focada na privacidade.",
"META_TITLE": "KoalaSync | Watch party para Netflix, YouTube e mais",
"META_DESCRIPTION": "Watch party na Netflix, YouTube, Twitch e qualquer vídeo HTML5. Extensão gratuita e open source para Chrome e Firefox. Sem conta, sem rastreio, sem anúncios.",
"SCHEMA_APP_DESC": "Watch party na Netflix, YouTube, Twitch e qualquer vídeo HTML5. Extensão gratuita e open source para Chrome e Firefox. Sem conta, sem rastreio, sem anúncios.",
"OG_TITLE": "KoalaSync | Watch party para Netflix, Emby, Jellyfin e quase qualquer vídeo",
"OG_DESCRIPTION": "Cria uma watch party na Netflix, Emby, Jellyfin, YouTube, Twitch e quase qualquer vídeo HTML5. Open source, privado e sem conta.",
"TWITTER_TITLE": "KoalaSync | Watch party para Netflix, Emby, Jellyfin e quase qualquer vídeo Extensão",
"TWITTER_DESCRIPTION": "Cria uma watch party na Netflix, Emby, Jellyfin, YouTube, Twitch e quase qualquer vídeo HTML5. Open source, privado e sem conta.",
"NAV_FEATURES": "Funcionalidades",
"NAV_HOW_IT_WORKS": "Como Funciona",
"HERO_TITLE": "Vejam Juntos.<span class='hero-line2'>Sincronia Perfeita.</span>",
"HERO_SUBTITLE": "A sua noite de cinema à distância e sem atrasos. Sem contas, sem recolha de dados. Partilhe um link e vejam juntos.",
"HERO_TITLE": "Transforma qualquer vídeo numa <span class='hero-highlight'>watch party</span>.",
"HERO_SUBTITLE": "A tua noite de cinema à distância, sem atrasos. Sem conta, sem rastreio, sem anúncios. Partilha um link e carreguem no play juntos.",
"HERO_MASCOT_ALT": "Um coala fofo a olhar para os botões de download",
"DEMO_SYNC": "Sincronizado",
"DEMO_HINT": "Demo ao vivo: dê play em qualquer aba e o KoalaSync mantém as duas em sincronia.",
"DEMO_NO_ROOM": "Ainda não conectado",
"DEMO_CREATE_ROOM": "Criar sala",
"DEMO_JOINED": "Entrou na sala",
"DEMO_TAB_SELECTED": "Separador selecionado",
"DEMO_SELECT_PLACEHOLDER": "Escolha um separador de vídeo…",
"MOBILE_DEMO_CTA": "Ver como funciona",
"MOBILE_DEMO_TITLE": "Demo ao vivo do KoalaSync",
"MOBILE_DEMO_CLOSE": "Fechar demo",
"ADD_TO_CHROME": "Adicionar ao Chrome",
"ADD_TO_FIREFOX": "Adicionar ao Firefox",
"COMPAT_HEADING": "Funciona nas suas plataformas favoritas",
@@ -35,20 +45,20 @@
"USE_CASE_3_DESC": "Aproveite as noites a dois. Ria das mesmas piadas e sinta as mesmas emoções exatamente no mesmo milissegundo.",
"WHY_TITLE": "Porquê o KoalaSync?",
"WHY_SUBTITLE": "Sincronização fiável, máxima privacidade e uso simples.",
"FEATURE_1_TITLE": "Controlo Total / Sincronia Instantânea",
"FEATURE_1_DESC": "Se um pausa, todos pausam. Se um avança, todos seguem. Sincronização em tempo real para todos os participantes.",
"FEATURE_1_TITLE": "Controlo do host e sincronização",
"FEATURE_1_DESC": "Tu decides quem controla a reprodução. Ativa o controlo do anfitrião para que apenas tu possas pausar e avançar, ou nomeia co-anfitriões.",
"FEATURE_2_TITLE": "Maratonas sem interrupções",
"FEATURE_2_DESC": "O KoalaSync deteta a mudança de episódios e pausa automaticamente até que todos tenham carregado o vídeo seguinte.",
"FEATURE_3_TITLE": "Sem Contas / Privacidade Absoluta",
"FEATURE_3_DESC": "Sem registos ou rastreios. O servidor corre apenas na RAM e apaga a sua sala assim que sair.",
"FEATURE_4_TITLE": "Suporte HTML5 Universal",
"FEATURE_4_DESC": "Funciona no YouTube, Twitch, Netflix, Jellyfin, Emby e qualquer site web. Nenhum dado de vídeo é enviado para nós.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby e quase qualquer página com vídeo HTML5. Só saem os sinais de sincronização, nunca o vídeo.",
"FEATURE_5_TITLE": "Servidores Próprios (Docker)",
"FEATURE_5_DESC": "Os nossos servidores são gratuitos, mas pode assumir o controlo total e iniciar o seu próprio servidor privado em segundos com Docker.",
"FEATURE_6_TITLE": "Convites Rápidos / Entrar com 1 Clique",
"FEATURE_6_DESC": "Nada de senhas complicadas. Partilhe o link e os seus amigos entram na sala automaticamente.",
"FEATURE_7_TITLE": "Compressor de Áudio Integrado",
"FEATURE_7_DESC": "O compressor de áudio reforça os diálogos suaves e baixa o volume das explosões. Funciona localmente, nenhum áudio sai do seu computador.",
"FEATURE_7_DESC": "Nunca mais mexer no volume. Um compressor integrado realça diálogos baixos e suaviza explosões altas, tudo processado localmente no teu navegador.",
"FEATURE_8_TITLE": "Código Aberto (Licença MIT)",
"FEATURE_8_DESC": "Todo o código é público no GitHub. 100% de transparência, sem software oculto.",
"COMP_TITLE": "KoalaSync vs Teleparty",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Políticas de privacidade do Teleparty:",
"COMP_FOOTNOTE_4": "Funciona em websites que permitem a injeção de scripts. Plataformas com DRM estrito podem ter limitações.",
"STEPS_TITLE": "Como Começar",
"STEP_1_TITLE": "Instalar a Extensão",
"STEP_1_DESC": "Adicione o KoalaSync ao seu navegador (Chrome ou Firefox).",
"STEP_1_ILLUS_DESC": "Extensão segura para ver vídeos",
"STEP_1_ILLUS_DL_CHROME": "Descarregar para Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Descarregar para Firefox",
"STEP_1_ILLUS_ACTIVE": "Extensão Ativa",
"STEP_1_ILLUS_READY": "Pronto!",
"STEP_2_TITLE": "Criar uma Sala",
"STEP_2_DESC": "Abra a extensão e clique em '+ Criar Nova Sala'. O link de convite é copiado automaticamente.",
"STEP_1_TITLE": "Criar e partilhar a sala",
"STEP_1_DESC": "Abra a extensão, crie uma sala com um clique e partilhe o link com os seus amigos. Eles entram instantaneamente pelo link de convite.",
"STEP_1_ILLUS_DESC": "Escolha um separador para ligar",
"STEP_1_ILLUS_DL_CHROME": "Ligar separador do YouTube",
"STEP_1_ILLUS_DL_FIREFOX": "Ligar separador do Netflix",
"STEP_1_ILLUS_ACTIVE": "Separador ligado",
"STEP_1_ILLUS_READY": "Pronto para ver em sincronia !",
"STEP_2_TITLE": "Selecionar o separador do vídeo",
"STEP_2_DESC": "Aceda ao separador do seu vídeo e selecione-o no menu da extensão. O KoalaSync liga os vossos leitores automaticamente.",
"STEP_2_ILLUS_ROOM": "Sala",
"STEP_2_ILLUS_SYNC": "Sincronia",
"STEP_2_ILLUS_SETTINGS": "Definições",
"STEP_2_ILLUS_CREATE": "+ Criar Nova Sala",
"STEP_2_ILLUS_MANUAL": "Manual / Avançado",
"STEP_2_ILLUS_COPIED": "Link copiado!",
"STEP_3_TITLE": "Partilhar e Sincronizar",
"STEP_3_DESC": "Envie o link aos amigos. Escolha um vídeo e desfrutem da reprodução juntos.",
"STEP_3_TITLE": "Desfrutar da sincronização",
"STEP_3_DESC": "Inicie a reprodução. Se alguém pausar, avançar ou reproduzir, o vídeo de todos mantém-se sincronizado em tempo real e sem atrasos.",
"STEP_3_ILLUS_IN_SYNC": "SINCRONIZADOS",
"SELF_TITLE": "Para utilizadores avançados",
"SELF_SUBTITLE": "Prefere gerir os seus dados? Inicie o seu próprio servidor em minutos com Docker.",
@@ -158,7 +168,7 @@
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SINCRO",
"MOCK_14": "Ir para a posição dos outros",
"MOCK_15": "Última Atividade",
"MOCK_16": "À espera de 1 amigo (KoalaPC)...",
"MOCK_16": "À espera de 1 amigo (🐶 HappyDog)...",
"MOCK_17": "Ignorar e reproduzir agora",
"MOCK_18": "O seu Nome",
"MOCK_19": "Ocultar separadores sem vídeo",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync não é afiliado à Netflix, Disney+, YouTube, Twitch, etc. Todas as marcas são propriedade dos seus titulares.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync - Alternativas e comparações",
"ALT_INDEX_META_DESC": "Explore comparações honestas e guias detalhados entre o KoalaSync e outras extensões de watch party e soluções de streaming.",
"ALT_INDEX_HEADING": "Guias e comparações",
"ALT_INDEX_INTRO": "Como o KoalaSync se compara a outras ferramentas de watch party e soluções de streaming? Leia as nossas comparações honestas e técnicas para encontrar a melhor opção para as suas noites de cinema à distância.",
"ALT_INDEX_READ_COMPARISON": "Ler comparação →",
"ALT_INDEX_READ_GUIDE": "Ler guia →",
"ALT_INDEX_FOOTER_LINK": "Guias e comparações",
"ALT_TELEPARTY_TITLE": "KoalaSync vs Teleparty: que ferramenta de festa de exibição deve utilizar?",
"ALT_TELEPARTY_META_DESC": "Uma comparação prática entre o KoalaSync e o Teleparty para festas de exibição, chat integrado, suporte para dispositivos móveis, sincronização de vídeo no browser, servidores de media auto-hospedados e utilização de código aberto.",
"ALT_TELEPARTY_INTRO": "O KoalaSync e o Teleparty resolvem o mesmo problema irritante: ver algo em conjunto sem ter de fazer toda aquela rotina de \"3, 2, 1, reproduzir\". Apenas usam abordagens diferentes.<br><br>O Teleparty é mais indicado se pretende um chat integrado ou se pretende ver em dispositivos móveis. O KoalaSync está mais virado para sessões de vídeo em browsers de desktop, onde já estão a conversar no Discord, Teamspeak ou noutra chamada de voz e apenas querem que a reprodução permaneça sincronizada.<br><br>A principal razão para eu ter criado o KoalaSync foi a flexibilidade. Foi concebido para funcionar com praticamente qualquer site que utilize um leitor de vídeo comum de browser, e não apenas com uma lista fixa de plataformas.",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "O KoalaSync não substitui uma chamada de voz. Se quiser conversar enquanto assiste, utilize ainda o Discord, Teamspeak, Signal, WhatsApp ou qualquer outra aplicação que utilize normalmente.<br><br>Todos também precisam de ter acesso ao vídeo ou à página nos seus próprios dispositivos. O KoalaSync não ignora as subscrições, logins, DRM, restrições regionais ou regras de plataforma.<br><br>Atualmente, funciona apenas em navegadores de desktop, não tem chat ou recurso de voz integrados e a compatibilidade depende sempre do navegador e do leitor de vídeo.",
"ALT_SCREEN_SUMMARY_TITLE": "Resumo",
"ALT_SCREEN_SUMMARY_BODY": "Partilhar o ecrã é a opção mais simples quando se quer algo rápido e não se liga muito à qualidade, privacidade ou controlo individual. O KoalaSync é mais adequado quando todos devem assistir localmente nos seus próprios browsers e a sessão deve parecer mais como assistir em conjunto.",
"ALT_TRY_KOALASYNC": "Experimente o KoalaSync"
"ALT_W2G_TITLE": "KoalaSync vs Watch2Gether: Qual solução de watch party se adapta melhor?",
"ALT_W2G_META_DESC": "Uma comparação honesta entre KoalaSync e Watch2Gether. Descubra quando a flexibilidade do KoalaSync é imbatível e por que o Watch2Gether ainda é a melhor escolha para o YouTube.",
"ALT_W2G_INTRO": "KoalaSync e Watch2Gether resolvem o mesmo problema: assistir vídeos sincronizados com amigos online sem coordenação manual. Embora Watch2Gether seja um dos centros mais antigos e populares para noites de cinema compartilhadas, o KoalaSync adota uma abordagem leve e completamente diferente. A ferramenta certa para você depende muito do que e onde você deseja assistir.",
"ALT_W2G_WHEN_W2G_TITLE": "Quando Watch2Gether é a melhor escolha",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether é imbatível para <strong>festas de exibição do YouTube</strong>. Com sua lista de reprodução e pesquisa integradas, qualquer pessoa na sala pode facilmente encontrar, adicionar e reproduzir novos vídeos. Todos assistem ao próximo vídeo juntos sem problemas.<br><br>Com o KoalaSync no YouTube, a reprodução automática padrão do site assume o controle, redirecionando cada usuário para um vídeo recomendado diferente. Nosso recurso automático de próximo episódio (“Episode Lobby”), que funciona muito bem no Netflix ou Disney+, não funciona no YouTube devido a essas recomendações dinâmicas. Para noites puras no YouTube, Watch2Gether é a melhor escolha.",
"ALT_W2G_WHEN_KOALA_TITLE": "Quando o KoalaSync se ajusta melhor",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync brilha em <strong>serviços reais de streaming</strong> (Netflix, Prime Video, Disney+) e servidores de mídia auto-hospedados (Jellyfin, Plex, Emby). Ao contrário do Watch2Gether, que muitas vezes não consegue reproduzir conteúdo premium, o KoalaSync sincroniza o player nativo diretamente no site.<br><br>Ele funciona em quase todos os sites com um player de vídeo HTML5 padrão. Você não precisa configurar uma sala virtual em um site de terceiros: basta ativar a extensão, entrar em um lobby e começar a assistir.",
"ALT_W2G_MAIN_DIFF_TITLE": "A principal diferença",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether é um <strong>site independente</strong> com chat integrado, listas de reprodução e suporte para webcam. KoalaSync é uma <strong>extensão de navegador minimalista</strong> que se conecta diretamente às guias normais do navegador.<br><br>Procurando um pacote completo para o YouTube com bate-papo integrado? Use Watch2Gether. Quer assistir filmes na Netflix ou no seu próprio servidor sem distrações, em qualidade nativa (sem compactação do servidor)? KoalaSync é a solução mais limpa.",
"ALT_W2G_LIMITS_TITLE": "Limitações honestas",
"ALT_W2G_LIMITS_BODY": "KoalaSync <strong>não possui listas de reprodução integradas ou pesquisa de vídeos</strong>. No YouTube, isso significa que a reprodução automática do próximo vídeo não permanecerá sincronizada.<br><br>Além disso, <strong>não há bate-papo integrado</strong>, e o KoalaSync atualmente só funciona em navegadores de desktop. Ele foi projetado partindo do pressuposto de que você já está falando via Discord, Teamspeak ou outras ferramentas de voz.",
"ALT_W2G_SUMMARY_TITLE": "Resumidamente",
"ALT_W2G_SUMMARY_BODY": "Para sessões espontâneas no YouTube com playlists e chat integrado, Watch2Gether é a melhor escolha. Para plataformas de streaming premium (como Netflix, Prime Video, Disney+), servidores auto-hospedados (Jellyfin, Plex, Emby) e flexibilidade máxima do navegador, KoalaSync é a ferramenta mais adequada e leve.",
"ALT_SCENER_TITLE": "KoalaSync vs Scener: Qual plataforma de watch party se adapta melhor?",
"ALT_SCENER_META_DESC": "Uma comparação honesta entre KoalaSync e Scener. Descubra quando o bate-papo na webcam do Scener vence e por que o KoalaSync é melhor para noites de cinema sem distrações.",
"ALT_SCENER_INTRO": "KoalaSync e Scener abordam festas de dois ângulos completamente diferentes. Scener é uma sala de cinema virtual com chat de vídeo integrado e salas interativas. KoalaSync, por outro lado, é uma extensão de navegador minimalista e amigável à privacidade que simplesmente sincroniza os controles de reprodução. A ferramenta mais adequada para você depende principalmente da importância dos recursos integrados de webcam e bate-papo para você.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Quando Scener é a melhor escolha",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener é uma escolha sólida se você deseja uma <strong>plataforma social completa</strong> com bate-papo por vídeo e áudio integrado diretamente em seu navegador. O Scener cria uma sala virtual onde as webcams do jogador e dos seus amigos são exibidas lado a lado. Isso é ideal para grandes festas públicas ou eventos de streaming virtual onde o aspecto social é o centro das atenções. No entanto, lembre-se de que a versão básica gratuita é suportada por anúncios e o Scener bloqueia muitos recursos (como visualização sem anúncios e chat de vídeo ilimitado) por meio de uma assinatura mensal (US$ 5,79/mês ou US$ 39,99/ano).",
"ALT_SCENER_WHEN_KOALA_TITLE": "Quando o KoalaSync se ajusta melhor",
"ALT_SCENER_WHEN_KOALA_BODY": "O KoalaSync brilha quando se trata de <strong>qualidade, privacidade e simplicidade de vídeo</strong>:<br><br>• <strong>Sem contas</strong>: você não precisa se registrar, fazer login ou gerenciar perfis. Basta ativar a extensão, compartilhar um código de sala e começar a assistir.<br>• <strong>Qualidade nativa real (4K/HDR)</strong>: o Scener transmite vídeo compactado de um servidor virtual em nuvem, o que pode levar à perda de qualidade e atrasos. O KoalaSync sincroniza o player nativo diretamente no seu computador, o que significa que você assiste filmes na resolução total da sua assinatura de streaming.<br>• <strong>Baixo uso de largura de banda</strong>: como apenas dados de controle (reprodução, pausa, registros de data e hora) são transmitidos, o KoalaSync praticamente não usa largura de banda extra. O Scener transmite todos os feeds de vídeo e câmera por meio de servidores em nuvem, o que pode sobrecarregar muito conexões de Internet mais lentas e laptops mais antigos.<br>• <strong>100% gratuito e sem anúncios</strong>: sem taxas de assinatura mensal, sem anúncios e sem rastreadores.<br>• <strong>Arquivos de vídeo locais</strong>: como o KoalaSync é executado localmente, você pode até assistir seus próprios arquivos de vídeo (como MP4) em sincronia com amigos. Basta arrastar e soltar o arquivo em uma guia do navegador o Scener não pode fazer isso porque seu player roda na nuvem.",
"ALT_SCENER_MAIN_DIFF_TITLE": "A principal diferença",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener é uma <strong>rede social comercial</strong> para assistir festas que é alimentada por navegadores virtuais em nuvem e financiada por anúncios e assinaturas mensais. KoalaSync é um <strong>utilitário de sincronização gratuito e com foco na privacidade</strong> que se conecta diretamente às guias do seu navegador. Ele deixa o bate-papo por voz/vídeo para aplicativos como Discord ou Teamspeak, concentrando-se inteiramente em manter sua reprodução fluida, privada e em sua qualidade original nativa.",
"ALT_SCENER_LIMITS_TITLE": "Limitações honestas",
"ALT_SCENER_LIMITS_BODY": "KoalaSync <strong>não oferece suporte integrado para chat ou webcam</strong>. É puramente uma ferramenta de sincronização e requer uma ferramenta de chamada de voz separada de sua escolha. Além disso, o KoalaSync atualmente é apenas para desktop, e a compatibilidade do arquivo de vídeo local depende inteiramente se o seu navegador suporta nativamente a reprodução do formato de vídeo e codecs de áudio.",
"ALT_SCENER_SUMMARY_TITLE": "Resumidamente",
"ALT_SCENER_SUMMARY_BODY": "Para grandes grupos de observação com bate-papo na webcam integrado e recursos sociais, o Scener é a escolha certa, desde que você não se importe com anúncios e acessos pagos premium. Se você deseja uma experiência totalmente gratuita, sem anúncios e sem distrações no player nativo (incluindo Netflix, Prime Video, Disney+ ou arquivos de navegador local) e já está em uma chamada de voz, o KoalaSync é a solução mais limpa e com melhor desempenho.",
"ALT_KOSMI_TITLE": "KoalaSync vs Kosmi: Qual alternativa de festa da Netflix se adapta melhor?",
"ALT_KOSMI_META_DESC": "Uma comparação honesta entre KoalaSync e Kosmi. Descubra por que a configuração sem extensão do Kosmi é conveniente e quando a qualidade de vídeo nativa do KoalaSync vence.",
"ALT_KOSMI_INTRO": "Tanto o KoalaSync quanto o Kosmi oferecem ótimas maneiras de assistir Netflix, YouTube e outras plataformas em sincronia com amigos. No entanto, as suas tecnologias subjacentes são fundamentalmente diferentes. Kosmi usa navegadores virtuais em nuvem que são executados diretamente em seu navegador sem instalar extensões. KoalaSync é uma extensão leve que sincroniza seu player de vídeo local. A abordagem mais adequada para você depende de suas prioridades em relação à qualidade, conveniência e privacidade do vídeo.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Quando Kosmi é a melhor escolha",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi é imbatível se você quiser <strong>evitar instalar qualquer coisa</strong> ou quiser assistir em dispositivos como tablets e smartphones. Como o Kosmi executa navegadores virtuais na nuvem, basta um simples link da web para ingressar. Além disso, Kosmi é uma plataforma de hangout completa: além do streaming sincronizado, você pode jogar jogos multijogador (como clássicos retrô do NES/SNES ou pôquer) e usar a webcam integrada, bate-papo por voz e texto. Se você quer uma noite de jogos sociais e assistir a uma festa sem configuração, Kosmi é uma solução fantástica.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "Quando o KoalaSync se ajusta melhor",
"ALT_KOSMI_WHEN_KOALA_BODY": "O KoalaSync brilha quando se trata de <strong>qualidade de reprodução, segurança e desempenho nativos</strong>:<br><br>• <strong>Sem riscos de segurança</strong>: com o Kosmi, você precisa fazer login na sua conta Netflix ou Prime em um computador virtual remoto na nuvem. Com o KoalaSync, você faz login com segurança no site oficial de streaming em seu próprio navegador, como faria normalmente. Suas senhas nunca saem da sua máquina.<br>• <strong>Qualidade total de vídeo (4K/HDR)</strong>: o Kosmi transmite a tela do navegador virtual como um feed de vídeo compactado, o que pode resultar em pixelização e buffer. O KoalaSync sincroniza os players nativos localmente: você desfruta de filmes na resolução completa e nítida da sua assinatura.<br>• <strong>Sem atraso e compatível com largura de banda</strong>: como o KoalaSync envia apenas comandos de controle (reproduzir/pausar/carimbos de data/hora), ele usa quase zero largura de banda. Kosmi transmite constantemente feeds de vídeo em HD, o que pode sobrecarregar conexões mais lentas.<br>• <strong>Arquivos de vídeo locais</strong>: se quiser assistir a um vídeo privado, basta arrastar e soltar o arquivo MP4 em uma guia do navegador e sincronizá-lo. Kosmi não pode acessar arquivos em seu disco rígido local.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "A principal diferença",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi é um <strong>ponto de encontro virtual na nuvem</strong> que transmite a tela de um navegador remoto para que ninguém precise instalar uma extensão. KoalaSync é uma <strong>camada de sincronização local do navegador</strong> que se conecta diretamente ao player nativo no site oficial de streaming. Embora o Kosmi seja mais versátil para minijogos e compatibilidade de dispositivos, o KoalaSync oferece uma experiência de streaming mais segura, fluida e nítida no player original.",
"ALT_KOSMI_LIMITS_TITLE": "Limitações honestas",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync <strong>requer a instalação de uma extensão de navegador</strong> e atualmente só funciona em PCs desktop. Ele <strong>não possui bate-papo ou webcams integrados</strong>, pois foi projetado sob a suposição de que você já está conversando via Discord ou outras ferramentas de voz. Também não oferece jogos integrados.",
"ALT_KOSMI_SUMMARY_TITLE": "Resumidamente",
"ALT_KOSMI_SUMMARY_BODY": "Para noites de jogos casuais com clássicos retrô e fácil acesso em dispositivos móveis sem qualquer instalação, o Kosmi é ideal. Para noites de cinema premium no Netflix, Prime Video, Disney+ ou Plex em qualidade 4K total, com segurança máxima e impacto mínimo na largura de banda, o KoalaSync é o vencedor claro.",
"ALT_TWOSEVEN_TITLE": "KoalaSync vs TwoSeven: Qual solução de watch party se adapta melhor?",
"ALT_TWOSEVEN_META_DESC": "Uma comparação honesta entre KoalaSync e TwoSeven. Descubra quando a webcam integrada do TwoSeven vence e por que o KoalaSync é melhor para Disney+ e Netflix.",
"ALT_TWOSEVEN_INTRO": "Tanto o KoalaSync quanto o TwoSeven usam a mesma abordagem básica para assistir grupos: eles sincronizam o player de vídeo original diretamente no seu navegador, em vez de transmitir um feed de vídeo compactado da nuvem. Isso garante qualidade de vídeo de alto nível para ambas as ferramentas. No entanto, embora o TwoSeven seja um portal comercial com chat de webcam integrado e níveis de assinatura, o KoalaSync continua sendo uma extensão minimalista, totalmente gratuita e com privacidade. Descubra aqui qual serviço se adapta melhor a você.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "Quando TwoSeven é a melhor escolha",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven é a escolha certa se você deseja uma <strong>solução completa com webcam integrada e chat de áudio</strong> diretamente no seu navegador. Se você quiser ver seus amigos enquanto assiste sem precisar rodar o Discord ou Teamspeak em segundo plano, o TwoSeven oferece essa integração de forma nativa. Além disso, funciona para o YouTube e alguns players de vídeo da web abertos sem extensões. É adequado para pequenos grupos de 2 a 3 pessoas que desejam compartilhar uma conexão visual durante a visualização.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "Quando o KoalaSync se ajusta melhor",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync brilha com sua <strong>total falta de taxas, privacidade e simplicidade</strong>:<br><br>• <strong>Sem paywalls</strong>: para assistir serviços premium como Disney+ ou Hulu sincronizados no TwoSeven, pelo menos um membro da sala deve apoiá-los no Patreon (a partir de US$ 3/mês). KoalaSync sincroniza Netflix, Prime Video, Disney+ e servidores de mídia auto-hospedados (Jellyfin, Plex, Emby) 100% grátis e sem restrições.<br>• <strong>Privacidade absoluta (sem rastreadores/anúncios)</strong>: TwoSeven é suportado por anúncios e usa vários rastreadores do Google, Facebook e outros. O KoalaSync não tem anúncios nem rastreadores e se comunica exclusivamente com o servidor de retransmissão somente RAM.<br>• <strong>Não é necessário registro</strong>: o TwoSeven exige que todos os participantes criem uma conta e façam login. O KoalaSync é totalmente gratuito. Basta instalar, inserir um código de sala e começar a assistir.<br>• <strong>Leve e com poucos recursos</strong>: a webcam integrada e os feeds de áudio do TwoSeven sobrecarregam sua CPU e sua rede. Ao deixar a comunicação para ferramentas como o Discord, o KoalaSync funciona de forma extremamente suave e preserva a vida útil da bateria.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "A principal diferença",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven é uma <strong>plataforma comercial</strong> com requisitos de registro, anúncios, chats peer-to-peer por webcam e paywalls do Patreon para serviços de streaming específicos. KoalaSync é um <strong>utilitário gratuito e de código aberto</strong> que se conecta diretamente às guias do seu navegador sem contas, rastreadores ou custos extras, permitindo assistir sem distrações no player nativo.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Limitações honestas",
"ALT_TWOSEVEN_LIMITS_BODY": "O KoalaSync <strong>não oferece webcam integrada ou bate-papo com áudio</strong> e pressupõe que você já esteja em uma chamada via Discord ou ferramenta semelhante. Além disso, o KoalaSync não possui sobreposição de caixa de bate-papo integrada e atualmente é apenas para desktop.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "Resumidamente",
"ALT_TWOSEVEN_SUMMARY_BODY": "Para pequenos grupos de duas ou três pessoas que desejam se ver através de webcams diretamente no navegador e não se importam em apoiar um Patreon para suporte Disney +, TwoSeven é uma boa opção. Para noites de cinema privadas, totalmente gratuitas e sem anúncios em qualidade 4K nativa (seja Netflix, Prime Video, Disney+ ou Jellyfin) sem registros, o KoalaSync é a escolha mais limpa e segura.",
"ALT_TRY_KOALASYNC": "Experimente o KoalaSync",
"MOCK_HOST_CONTROL_LABEL": "Controlo do anfitrião",
"MOCK_HOST_CONTROL_TOGGLE": "Apenas eu posso controlar a reprodução",
"LABEL_SELECT_VIDEO": "Selecionar Vídeo",
"OPTION_SELECT_TAB": "-- Selecionar um Separador --",
"THEME_TOGGLE_LABEL": "Alternar modo claro/escuro",
"FAQ_SHOW_ALL": "Mostrar todas as perguntas",
"FAQ_HIDE_ALL": "Ocultar perguntas",
"SELF_SHOW_SETUP": "Mostrar guia de configuração",
"SELF_HIDE_SETUP": "Ocultar guia",
"HERO_TRUST": "Grátis · Open source · Sem conta",
"COMP_MORE_GUIDES": "Comparação completa e mais alternativas"
}
+108 -28
View File
@@ -5,18 +5,28 @@
"LANG_TOGGLE_URL": "../",
"LANG_TOGGLE_TEXT": "EN",
"OG_LOCALE": "ru_RU",
"META_TITLE": "KoalaSync | Синхронизация Netflix, YouTube и любого видео с друзьями",
"META_DESCRIPTION": "Смотрите Netflix, YouTube, Twitch и любые HTML5-видео в синхронизации с друзьями. Бесплатное расширение браузера с открытым кодом. Регистрация не требуется.",
"SCHEMA_APP_DESC": "Смотрите Netflix, YouTube, Twitch и любые HTML5-видео в синхронизации с друзьями. Бесплатное расширение браузера с открытым кодом. Регистрация не требуется.",
"OG_TITLE": "KoalaSync | Синхронизация Netflix, Emby, Jellyfin и почти любого видео с друзьями",
"OG_DESCRIPTION": "Смотрите Netflix, Emby, Jellyfin, YouTube, Twitch и почти любое HTML5-видео в идеальной синхронизации. Открытое и ориентированное на конфиденциальность расширение для Chrome и Firefox.",
"TWITTER_TITLE": "KoalaSync | Синхронизация Netflix, Emby, Jellyfin и почти любого видео с друзьями Расширение",
"TWITTER_DESCRIPTION": "Смотрите Netflix, Emby, Jellyfin, YouTube, Twitch и почти любое HTML5-видео в идеальной синхронизации с друзьями. Открытое и конфиденциальное расширение для Chrome и Firefox.",
"META_TITLE": "KoalaSync | Watch party для Netflix, YouTube и любых видео",
"META_DESCRIPTION": "Watch party в Netflix, YouTube, Twitch и любом HTML5-видео. Бесплатное расширение с открытым кодом для Chrome и Firefox. Без аккаунта, слежки и рекламы.",
"SCHEMA_APP_DESC": "Watch party в Netflix, YouTube, Twitch и любом HTML5-видео. Бесплатное расширение с открытым кодом для Chrome и Firefox. Без аккаунта, слежки и рекламы.",
"OG_TITLE": "KoalaSync | Watch party для Netflix, Emby, Jellyfin и почти любого видео",
"OG_DESCRIPTION": "Запускайте watch party в Netflix, Emby, Jellyfin, YouTube, Twitch и почти любом HTML5-видео. Open source, приватно и без аккаунта.",
"TWITTER_TITLE": "KoalaSync | Watch party для Netflix, Emby, Jellyfin и почти любого видео – Расширение",
"TWITTER_DESCRIPTION": "Запускайте watch party в Netflix, Emby, Jellyfin, YouTube, Twitch и почти любом HTML5-видео. Open source, приватно и без аккаунта.",
"NAV_FEATURES": "Функции",
"NAV_HOW_IT_WORKS": "Как это работает",
"HERO_TITLE": "Смотрите вместе.<span class='hero-line2'>Синхронно на 100%.</span>",
"HERO_SUBTITLE": "Ваш киновечер на расстоянии без задержек. Без регистрации и сбора данных. Просто поделитесь ссылкой и смотрите вместе.",
"HERO_TITLE": "Преврати любое видео в <span class='hero-highlight'>watch party</span>.",
"HERO_SUBTITLE": "Ваш киновечер на расстоянии, без задержек. Без аккаунта, без слежки, без рекламы. Просто поделитесь ссылкой и нажмите play вместе.",
"HERO_MASCOT_ALT": "Милый коала стоит и смотрит вниз на кнопки загрузки",
"DEMO_SYNC": "Синхронно",
"DEMO_HINT": "Живое демо: нажмите play в любой вкладке, и KoalaSync синхронизирует обе.",
"DEMO_NO_ROOM": "Ещё не подключено",
"DEMO_CREATE_ROOM": "Создать комнату",
"DEMO_JOINED": "В комнате",
"DEMO_TAB_SELECTED": "Вкладка выбрана",
"DEMO_SELECT_PLACEHOLDER": "Выберите вкладку с видео…",
"MOBILE_DEMO_CTA": "Посмотреть, как работает",
"MOBILE_DEMO_TITLE": "Живое демо KoalaSync",
"MOBILE_DEMO_CLOSE": "Закрыть демо",
"ADD_TO_CHROME": "Установить в Chrome",
"ADD_TO_FIREFOX": "Установить в Firefox",
"COMPAT_HEADING": "Работает на ваших любимых платформах",
@@ -35,20 +45,20 @@
"USE_CASE_3_DESC": "Сократите расстояние и наслаждайтесь свиданиями. Переживайте каждый поворот сюжета, смейтесь над шутками и делитесь эмоциями в одну и ту же миллисекунду.",
"WHY_TITLE": "Почему KoalaSync?",
"WHY_SUBTITLE": "Создан для надежной синхронизации, конфиденциальности и простой настройки.",
"FEATURE_1_TITLE": "Полный контроль и мгновенный синхро",
"FEATURE_1_DESC": "Один ставит на паузу — пауза у всех. Один перематывает — все перематывают. Наш двухфазный протокол координирует воспроизведение в реальном времени у всех участников.",
"FEATURE_1_TITLE": "Управление хоста и синхронизация",
"FEATURE_1_DESC": "Вы решаете, кто управляет воспроизведением. Включите управление ведущего, чтобы только вы могли ставить на паузу и перемотку, или назначайте со-ведущих.",
"FEATURE_2_TITLE": "Бесконечные марафоны",
"FEATURE_2_DESC": "Синхронное автовоспроизведение. KoalaSync автоматически определяет переход на следующую серию и ждет, пока она загрузится у всех участников.",
"FEATURE_3_TITLE": "Без аккаунтов и хранения данных",
"FEATURE_3_DESC": "Без регистрации, без отслеживания, без следов на диске. Сервер работает исключительно во временной RAM и полностью стирает вашу комнату при выходе.",
"FEATURE_4_TITLE": "Универсальная поддержка HTML5",
"FEATURE_4_DESC": "Работает на YouTube, Twitch, Netflix, Jellyfin, Emby и почти на любой веб-странице со стандартным HTML5-видеотегом. Подходит для локальных медиатек. Никакие видеоданные никогда не отправляются на наши серверы — только метаданные синхронизации.",
"FEATURE_4_DESC": "Netflix, YouTube, Twitch, Jellyfin, Emby и почти любая страница с HTML5-видео. Из браузера уходят только сигналы синхронизации, но не само видео.",
"FEATURE_5_TITLE": "Self-Hosted и готов к Docker",
"FEATURE_5_DESC": "Наши официальные серверы бесплатны и быстры, но вы можете получить полный контроль. Запустите свой собственный приватный ретранслятор в Docker за секунды.",
"FEATURE_6_TITLE": "Быстрые приглашения в 1 клик",
"FEATURE_6_DESC": "Не нужно обмениваться IP-адресами или паролями. Отправьте сгенерированную ссылку друзьям, чтобы они автоматически вошли в комнату в один клик.",
"FEATURE_7_TITLE": "Выравнивание громкости / Аудио компрессор",
"FEATURE_7_DESC": "Больше никакой постоянной регулировки громкости. Встроенный аудио компрессор усиливает тихие диалоги и приглушает громкие взрывы. Работает на Netflix, Prime Video, Disney+, YouTube и любом HTML5-видео. Полностью локально — никакие аудиоданные не покидают ваш компьютер.",
"FEATURE_7_DESC": "Больше не нужно крутить громкость. Встроенный компрессор поднимает тихие диалоги и смягчает громкие взрывы, обрабатывая всё локально в браузере.",
"FEATURE_8_TITLE": "Открытый исходный код (Лицензия MIT)",
"FEATURE_8_DESC": "Весь исходный код публично доступен для проверки на GitHub. Никаких «черных ящиков», никаких проприетарных бинарных файлов (blobs) — 100% прозрачность от relay-сервера до расширения браузера.",
"COMP_TITLE": "KoalaSync против Teleparty",
@@ -87,23 +97,23 @@
"COMP_FOOTNOTE_3": "Политика конфиденциальности Teleparty и сбор трекеров:",
"COMP_FOOTNOTE_4": "Работает на сайтах, разрешающих инъекцию скриптов в стандартные видеотеги HTML5. Сайты с очень строгой политикой безопасности контента (CSP), защитой от копирования DRM или сильно обфусцированными оболочками плееров (например, сложные теневые DOM) могут блокировать автоматическое управление.",
"STEPS_TITLE": "С чего начать",
"STEP_1_TITLE": "Установить расширение",
"STEP_1_DESC": "Добавьте KoalaSync в браузер из Chrome Web Store, Firefox Add-ons or скачайте последний ZIP-архив разработчика с GitHub.",
"STEP_1_ILLUS_DESC": "Ориентированный на конфиденциальность синхронизатор видео",
"STEP_1_ILLUS_DL_CHROME": "Скачать для Chrome",
"STEP_1_ILLUS_DL_FIREFOX": "Скачать для Firefox",
"STEP_1_ILLUS_ACTIVE": "Расширение активно",
"STEP_1_ILLUS_READY": "Готовы смотреть вместе!",
"STEP_2_TITLE": "Создать комнату",
"STEP_2_DESC": "Откройте меню расширения и нажмите «+ Создать новую комнату». KoalaSync автоматически сгенерирует ID и пароль, войдет в нее и скопирует ссылку-приглашение.",
"STEP_1_TITLE": "Создать комнату и поделиться",
"STEP_1_DESC": "Откройте расширение, создайте комнату одним кликом и отправьте ссылку друзьям. Они мгновенно подключатся по приглашению.",
"STEP_1_ILLUS_DESC": "Выберите вкладку для подключения",
"STEP_1_ILLUS_DL_CHROME": "Подключить вкладку YouTube",
"STEP_1_ILLUS_DL_FIREFOX": "Подключить вкладку Netflix",
"STEP_1_ILLUS_ACTIVE": "Вкладка подключена",
"STEP_1_ILLUS_READY": "Готово к синхронному просмотру !",
"STEP_2_TITLE": "Выбрать вкладку с видео",
"STEP_2_DESC": "Перейдите на вкладку с видео и выберите её в меню расширения. KoalaSync автоматически свяжет ваши плееры.",
"STEP_2_ILLUS_ROOM": "Комната",
"STEP_2_ILLUS_SYNC": "Синхро",
"STEP_2_ILLUS_SETTINGS": "Опции",
"STEP_2_ILLUS_CREATE": "+ Создать комнату",
"STEP_2_ILLUS_MANUAL": "Ручное подключение / Дополнительно",
"STEP_2_ILLUS_COPIED": "Ссылка скопирована!",
"STEP_3_TITLE": "Поделиться и смотреть",
"STEP_3_DESC": "Отправьте ссылку друзьям. Как только они присоединятся, выберите вкладку с видео и наслаждайтесь синхронным просмотром.",
"STEP_3_TITLE": "Наслаждаться синхронизацией",
"STEP_3_DESC": "Нажмите кнопку воспроизведения. Когда кто-то ставит на паузу, перематывает или запускает видео, просмотр синхронизируется у всех без задержек.",
"STEP_3_ILLUS_IN_SYNC": "В СИНХРОНЕ",
"SELF_TITLE": "Для селф-хостеров",
"SELF_SUBTITLE": "Не доверяете нашему серверу? Сохраняйте полный контроль над данными. Разверните собственный приватный сервер за пару минут.",
@@ -126,9 +136,9 @@
"FAQ_Q4": "Какие браузеры и платформы поддерживают KoalaSync?",
"FAQ_A4": "Google Chrome, Mozilla Firefox, Microsoft Edge, Opera, Brave и все браузеры на базе Chromium. Установите из Chrome Web Store или Firefox Add-ons.",
"FAQ_Q5": "Всем ли моим друзьям нужно устанавливать расширение?",
"FAQ_A5": "Да, каждому участнику нужен KoalaSync но без регистрации и создания учётной записи. Просто перейдите по ссылке-приглашению, установите расширение (если ещё нет) и вы автоматически в комнате.",
"FAQ_A5": "Да, каждому участнику нужен KoalaSync, но без регистрации и создания учётной записи. Просто перейдите по ссылке-приглашению, установите расширение (если ещё нет) и вы автоматически в комнате.",
"FAQ_Q6": "Мои данные в безопасности? Что, если я не доверяю официальному серверу?",
"FAQ_A6": "Полностью безопасно. Relay-сервер KoalaSync работает только в ОЗУ все данные сессии удаляются при выходе из комнаты. Никаких баз данных, логов, аналитики и учётных записей. Если хотите полный контроль: разверните свой приватный relay-сервер через Docker за пару минут. Исходный код полностью открыт и доступен для аудита на GitHub.",
"FAQ_A6": "Полностью безопасно. Relay-сервер KoalaSync работает только в ОЗУ, все данные сессии удаляются при выходе из комнаты. Никаких баз данных, логов, аналитики и учётных записей. Если хотите полный контроль: разверните свой приватный relay-сервер через Docker за пару минут. Исходный код полностью открыт и доступен для аудита на GitHub.",
"FAQ_Q7": "Можно ли исправить тихие диалоги и громкие взрывы при просмотре видео в браузере?",
"FAQ_A7": "Да. KoalaSync 2.2.0 включает встроенный аудио компрессор, который уменьшает разницу между тихими и громкими частями видео. Он работает локально через Web Audio API — аудиоданные никогда не покидают ваш компьютер. Откройте попап, создайте комнату, перейдите в Настройки → Audio Processing, включите компрессор и выберите пресет. Работает на Netflix, Prime Video, Disney+, YouTube и любом сайте с HTML5-видео.",
"HOWTO_TITLE": "Как синхронизировать видео с друзьями с помощью KoalaSync",
@@ -157,7 +167,7 @@
"MOCK_12": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"14\" height=\"14\" aria-hidden=\"true\"><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"/></svg> Пауза",
"MOCK_13": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"14\" height=\"14\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg> SYNC",
"MOCK_14": "Последняя активность",
"MOCK_15": "Ожидание 1 участника (KoalaPC)...",
"MOCK_15": "Ожидание 1 участника (🐶 HappyDog)...",
"MOCK_16": "Пропустить и играть",
"MOCK_17": "Ваше имя",
"MOCK_18": "Скрыть лишние вкладки",
@@ -179,6 +189,13 @@
"FOOTER_PRIVACY_LINK": "privacy",
"FOOTER_DISCLAIMER": "KoalaSync не связан, не спонсируется и не аффилирован с Netflix, Disney+, Amazon, YouTube, Twitch или любой другой стриминговой платформой. Все товарные знаки являются собственностью их соответствующих владельцев.",
"FOOTER_SUPPORT": "Support KoalaSync",
"ALT_INDEX_TITLE": "KoalaSync — альтернативы и сравнения",
"ALT_INDEX_META_DESC": "Изучите честные сравнения и подробные руководства о KoalaSync, других расширениях для совместного просмотра и стриминговых решениях.",
"ALT_INDEX_HEADING": "Руководства и сравнения",
"ALT_INDEX_INTRO": "Как KoalaSync выглядит на фоне других инструментов для совместного просмотра и стриминговых решений? Прочитайте наши честные технические сравнения, чтобы выбрать лучший вариант для удалённых киновечеров.",
"ALT_INDEX_READ_COMPARISON": "Читать сравнение →",
"ALT_INDEX_READ_GUIDE": "Читать руководство →",
"ALT_INDEX_FOOTER_LINK": "Руководства и сравнения",
"ALT_TELEPARTY_TITLE": "KoalaSync или Teleparty: какой инструмент выбрать для совместного просмотра?",
"ALT_TELEPARTY_META_DESC": "Практическое сравнение KoalaSync и Teleparty: встроенный чат, поддержка мобильных устройств, синхронизация видео в браузере, использование собственных медиасерверов и открытый исходный код.",
"ALT_TELEPARTY_INTRO": "И KoalaSync, и Teleparty решают одну и ту же надоедливую проблему: как смотреть что-либо вместе, не прибегая к команде «3, 2, 1, начали!». Просто они используют разные подходы.<br><br>Teleparty — отличный выбор, если вам нужен встроенный чат или возможность просмотра на мобильном устройстве. KoalaSync больше подходит для совместного просмотра через браузер на компьютере: вы общаетесь, например, в Discord, TeamSpeak или другом голосовом чате, а программа просто обеспечивает синхронизацию воспроизведения.<br><br>Главной причиной создания KoalaSync стала гибкость. Инструмент задуман так, чтобы работать практически с любым сайтом, использующим стандартный браузерный видеоплеер, а не только с фиксированным списком платформ. Это касается и решений для самостоятельного хостинга (например, Emby, Jellyfin и Plex), и локальных или частных доменов, и множества обычных веб-страниц с видео.",
@@ -205,5 +222,68 @@
"ALT_SCREEN_LIMITS_BODY": "KoalaSync не заменяет голосовую связь. Если во время просмотра вы хотите общаться, используйте Discord, TeamSpeak, Signal, WhatsApp или любой другой привычный вам сервис.<br><br>Каждому участнику также необходим доступ к видео или веб-странице на собственном устройстве. KoalaSync не обходит требования к подписке, авторизации, DRM-защите, региональные ограничения или правила платформ.<br><br>На данный момент сервис работает только в браузерах на ПК, не имеет встроенного чата или функции голосовой связи, а совместимость зависит от конкретного браузера и видеоплеера.",
"ALT_SCREEN_SUMMARY_TITLE": "Краткий обзор",
"ALT_SCREEN_SUMMARY_BODY": "Демонстрация экрана — самый простой вариант, если нужно быстро всё организовать и вас не особо волнуют качество, конфиденциальность или возможность индивидуального управления. KoalaSync лучше подходит для ситуаций, когда каждый участник смотрит видео локально в своем браузере, а сам сеанс больше напоминает реальный совместный просмотр.",
"ALT_TRY_KOALASYNC": "Попробовать KoalaSync"
"ALT_W2G_TITLE": "KoalaSync против Watch2Gether: какое решение для часовых вечеринок подходит лучше?",
"ALT_W2G_META_DESC": "Честное сравнение KoalaSync и Watch2Gether. Узнайте, когда гибкость KoalaSync непревзойденна и почему Watch2Gether по-прежнему остается лучшим выбором для YouTube.",
"ALT_W2G_INTRO": "KoalaSync и Watch2Gether решают одну и ту же проблему: синхронизировать видео с друзьями в Интернете без координации вручную. В то время как Watch2Gether — один из старейших и самых популярных центров для совместных вечеров кино, KoalaSync использует совершенно другой, облегченный подход. Какой инструмент подойдет именно вам, во многом зависит от того, что и где вы хотите смотреть.",
"ALT_W2G_WHEN_W2G_TITLE": "Когда Watch2Gether — лучший выбор",
"ALT_W2G_WHEN_W2G_BODY": "Watch2Gether непревзойденно подходит для <strong>вечеринок просмотра YouTube</strong>. Благодаря встроенному списку воспроизведения и поиску любой человек в комнате может легко находить, добавлять и воспроизводить новые видео. Все вместе без проблем смотрят следующее видео.<br><br>При использовании KoalaSync на YouTube автоматический запуск сайта по умолчанию включается, перенаправляя каждого пользователя на другое рекомендуемое видео. Наша функция автоматического перехода к следующему эпизоду («Лобби эпизода»), которая отлично работает на Netflix или Disney+, не работает на YouTube из-за этих динамических рекомендаций. Для вечеров, посвященных чистому YouTube, Watch2Gether — лучший выбор.",
"ALT_W2G_WHEN_KOALA_TITLE": "Когда KoalaSync подходит лучше",
"ALT_W2G_WHEN_KOALA_BODY": "KoalaSync отлично работает на <strong>реальных потоковых сервисах</strong> (Netflix, Prime Video, Disney+) и автономных медиасерверах (Jellyfin, Plex, Emby). В отличие от Watch2Gether, который зачастую вообще не может воспроизводить премиум-контент, KoalaSync синхронизирует собственный проигрыватель непосредственно с веб-сайтом.<br><br>Он работает практически на любом сайте со стандартным видеоплеером HTML5. Вам не нужно настраивать виртуальную комнату на стороннем сайте: просто активируйте расширение, присоединитесь к лобби и начинайте просмотр.",
"ALT_W2G_MAIN_DIFF_TITLE": "Основное отличие",
"ALT_W2G_MAIN_DIFF_BODY": "Watch2Gether  это <strong>автономный веб-сайт</strong> со встроенным чатом, плейлистами и поддержкой веб-камеры. KoalaSync  это <strong>минималистичное расширение для браузера</strong>, которое подключается непосредственно к обычным вкладкам браузера.<br><br>Ищете универсальный пакет для YouTube со встроенным чатом? Используйте Watch2Gether. Хотите смотреть фильмы на Netflix или на своем собственном сервере, не отвлекаясь, в исходном качестве (без сжатия сервера)? KoalaSync — более чистое решение.",
"ALT_W2G_LIMITS_TITLE": "Честные ограничения",
"ALT_W2G_LIMITS_BODY": "KoalaSync <strong>не имеет встроенных плейлистов и поиска видео</strong>. На YouTube это означает, что автоматическое воспроизведение следующего видео не будет синхронизироваться.<br><br>Кроме того, здесь <strong>нет встроенного чата</strong>, а KoalaSync в настоящее время работает только в браузерах для настольных компьютеров. Он разработан исходя из предположения, что вы в любом случае уже разговариваете через Discord, Teamspeak или другие голосовые инструменты.",
"ALT_W2G_SUMMARY_TITLE": "Суммируя",
"ALT_W2G_SUMMARY_BODY": "Watch2Gether — лучший выбор для спонтанных сеансов YouTube с плейлистами и встроенным чатом. Для платформ потокового вещания премиум-класса (таких как Netflix, Prime Video, Disney+), автономных серверов (Jellyfin, Plex, Emby) и максимальной гибкости браузера KoalaSync является более подходящим и легким инструментом.",
"ALT_SCENER_TITLE": "KoalaSync против Scener: какая платформа для часовых вечеринок подходит лучше?",
"ALT_SCENER_META_DESC": "Честное сравнение KoalaSync и Scener. Узнайте, когда чат с веб-камеры Scener побеждает и почему KoalaSync лучше всего подходит для вечерних кинопросмотров, не отвлекаясь.",
"ALT_SCENER_INTRO": "KoalaSync и Scener подходят к просмотру вечеринок с двух совершенно разных точек зрения. Scener — виртуальный кинотеатр со встроенным видеочатом и интерактивными комнатами. KoalaSync, с другой стороны, представляет собой минималистское расширение для браузера, обеспечивающее конфиденциальность, которое просто синхронизирует элементы управления воспроизведением. Какой инструмент подойдет вам лучше всего, зависит главным образом от того, насколько важны для вас встроенные функции веб-камеры и чата.",
"ALT_SCENER_WHEN_SCENER_TITLE": "Когда Scener — лучший выбор",
"ALT_SCENER_WHEN_SCENER_BODY": "Scener — хороший выбор, если вам нужна <strong>универсальная социальная платформа</strong> со встроенным видео- и аудиочатом прямо в вашем браузере. Scener создает виртуальную комнату, в которой веб-камеры игрока и ваших друзей отображаются рядом. Это идеально подходит для больших публичных вечеринок или виртуальных потоковых мероприятий, где социальный аспект находится на переднем плане. Однако имейте в виду, что бесплатная базовая версия поддерживаетс рекламой, а Scener блокирует многие функции (например, просмотр без рекламы и неограниченный видеочат) за ежемесячную подписку (5,79 долларов США в месяц или 39,99 долларов США в год).",
"ALT_SCENER_WHEN_KOALA_TITLE": "Когда KoalaSync подходит лучше",
"ALT_SCENER_WHEN_KOALA_BODY": "KoalaSync превосходен, когда дело касается <strong>качества видео, конфиденциальности и простоты</strong>:<br><br>• <strong>Нет учетных записей</strong>: вам не нужно регистрироваться, входить в систему или управлять профилями. Просто активируйте расширение, поделитесь кодом комнаты и начинайте просмотр.<br>• <strong>Настоящее качество (4K/HDR)</strong>: Scener передает сжатое видео с виртуального облачного сервера, что может привести к потере качества и задержкам. KoalaSync синхронизирует встроенный проигрыватель непосредственно на вашем компьютере, что означает, что вы смотрите фильмы в полном разрешении, предусмотренном вашей подпиской на потоковую передачу.<br>• <strong>Низкое использование полосы пропускания</strong>: поскольку передаются только управляющие данные (воспроизведение, пауза, временные метки), KoalaSync практически не использует дополнительную полосу пропускания. Scener передает все видео и видео с камер через облачные серверы, что может сильно нагружать медленные интернет-соединения и стрые ноутбуки.<br>• <strong>100 % бесплатно и без рекламы</strong>: без ежемесячной абонентской платы, без рекламы и трекеров.<br>• <strong>Локальные видеофайлы</strong>: поскольку KoalaSync работает локально, вы даже можете смотреть свои собственные видеофайлы (например, MP4) синхронно с друзьями. Просто перетащите файл на вкладку браузера — Scener не может этого сделать, поскольку его плеер работает в облаке.",
"ALT_SCENER_MAIN_DIFF_TITLE": "Основное отличие",
"ALT_SCENER_MAIN_DIFF_BODY": "Scener  это <strong>коммерческая социальная сеть</strong> для вечеринок, работающая на базе виртуальных облачных браузеров и финансируемая за счет рекламы и ежемесячных подписок. KoalaSync  это <strong>бесплатная утилита синхронизации, обеспечивающая конфиденциальность</strong>, которая подключается непосредственно к вкладкам вашего браузера. Он оставляет голосовой/видеочат таким приложениям, как Discord или Teamspeak, полностью сосредотачиваясь на обеспечении плавного, конфиденциального и исходного качества воспроизведения.",
"ALT_SCENER_LIMITS_TITLE": "Честные ограничения",
"ALT_SCENER_LIMITS_BODY": "KoalaSync не предлагает <strong>отсутствие встроенной поддержки чата или веб-камеры</strong>. Это чисто инструмент синхронизации, для которого требуется отдельный инструмент голосового вызова по вашему выбору. Кроме того, KoalaSync в настоящее время доступен только для настольных компьютеров, а совместимость локальных видеофайлов полностью зависит от того, поддерживает ли ваш браузер изначально воспроизведение видеоформата и аудиокодеков.",
"ALT_SCENER_SUMMARY_TITLE": "Суммируя",
"ALT_SCENER_SUMMARY_BODY": "Для больших вечеринок просмотра со встроенным чатом через веб-камеру и социальными функциями Scener — правильный выбор, при условии, что вы не возражаете против рекламы и платного доступа премиум-класса. Если вам нужна совершенно бесплатная работа без рекламы и отвлекающих факторов в родном плеере (включая файлы Netflix, Prime Video, Disney+ или локального браузера), и вы уже участвуете в голосовом вызове, KoalaSync — более чистое и производительное решение.",
"ALT_KOSMI_TITLE": "KoalaSync против Kosmi: какая альтернатива вечеринке Netflix подходит лучше?",
"ALT_KOSMI_META_DESC": "Честное сравнение KoalaSync и Kosmi. Узнайте, почему настройка Kosmi без расширений удобна и когда преимущество имеет собственное качество видео KoalaSync.",
"ALT_KOSMI_INTRO": "И KoalaSync, и Kosmi предлагают отличные способы синхронного просмотра Netflix, YouTube и других платформ с друзьями. Однако их базовые технологии принципиально различны. Kosmi использует виртуальные облачные браузеры, которые запускаются прямо в вашем веб-браузере без установки расширений. KoalaSync — это легкое расширение, которое синхронизирует ваш локальный видеоплеер. Какой подход подойдет вам лучше всего, зависит от ваших приоритетов в отношении качества видео, удобства и конфиденциальности.",
"ALT_KOSMI_WHEN_KOSMI_TITLE": "Когда Косми — лучший выбор",
"ALT_KOSMI_WHEN_KOSMI_BODY": "Kosmi непобедим, если вы хотите <strong>не устанавливать что-либо</strong> или хотите смотреть на таких устройствах, как планшеты и смартфоны. Поскольку Kosmi использует виртуальные браузеры в облаке, все, что нужно для присоединения, — это простая веб-ссылка. Кроме того, Kosmi — это универсальная платформа для видеовстреч: помимо синхронизированной потоковой передачи вы можете играть в многопользовательские игры (например, в ретро-классику для NES/SNES или в покер) и использовать встроенную веб-камеру, голосовой и текстовый чат. Если вы хотите провести вечер социальных игр и посмотреть вечеринку без предварительной настройки, Kosmi — фантастическое решение.",
"ALT_KOSMI_WHEN_KOALA_TITLE": "Когда KoalaSync подходит лучше",
"ALT_KOSMI_WHEN_KOALA_BODY": "KoalaSync превосходен, когда дело касается <strong>собственного качества воспроизведения, безопасности и производительности</strong>:<br><br>• <strong>Нет угроз безопасности</strong>: с Kosmi вам необходимо войти в свою учетную запись Netflix или Prime на удаленном виртуальном компьютере в облаке. С KoalaSync вы безопасно входите на официальный сайт потокового вещания в своем браузере, как обычно. Ваши пароли никогда не покидают ваш компьютер.<br>• <strong>Полное качество видео (4K/HDR)</strong>: Kosmi транслирует экран виртуального браузера в виде сжатого видеопотока, что может привести к пикселизации и буферизации. KoalaSync локально синхронизирует встроенные проигрыватели: вы наслаждаетесь фильмами в полном кристально чистом разрешении, предусмотренном вашей подпиской.<br>• <strong>Без задержек и оптимальное использование пропускной способности</strong>: поскольку KoalaSync отправляет только команды управления (воспроизведение/пауза/временные метки), он использует практически нулевую полосу пропускания. Kosmi постоянно транслирует видео высокой четкости, что может затруднить медленное соединение.<br>• <strong>Локальные видеофайлы</strong>. Если вы хотите посмотреть личное видео, просто перетащите файл MP4 на вкладку браузера и синхронизируйте его. Kosmi не может получить доступ к файлам на вашем локальном жестком диске.",
"ALT_KOSMI_MAIN_DIFF_TITLE": "Основное отличие",
"ALT_KOSMI_MAIN_DIFF_BODY": "Kosmi  это <strong>виртуальная облачная тусовка</strong>, которая транслирует экран удаленного браузера, поэтому никому не придется устанавливать расширение. KoalaSync  это <strong>уровень синхронизации с локальным браузером</strong>, который подключается непосредственно к встроенному плееру на официальном сайте потокового вещания. В то время как Kosmi более универсален для мини-игр и совместимости с устройствами, KoalaSync предлагает более безопасный, плавный и четкий процесс потоковой передачи в исходном проигрывателе.",
"ALT_KOSMI_LIMITS_TITLE": "Честные ограничения",
"ALT_KOSMI_LIMITS_BODY": "KoalaSync <strong>требует установки расширения для браузера</strong> и в настоящее время работает только на настольных ПК. Он <strong>не имеет встроенного чата или веб-камеры</strong>, поскольку он разработан с учетом того, что вы все равно уже разговариваете через Discord или другие голосовые инструменты. Он также не предлагает встроенных игр.",
"ALT_KOSMI_SUMMARY_TITLE": "Суммируя",
"ALT_KOSMI_SUMMARY_BODY": "Kosmi идеально подходит для вечерних казуальных игр с классическими ретро-играми и легким доступом на мобильных устройствах без какой-либо установки. KoalaSync — явный победитель для вечерних фильмов премиум-класса на Netflix, Prime Video, Disney+ или Plex в полном качестве 4K, с максимальной безопасностью и минимальным воздействием на полосу пропускания.",
"ALT_TWOSEVEN_TITLE": "KoalaSync против TwoSeven: какое решение для вечеринок подходит лучше?",
"ALT_TWOSEVEN_META_DESC": "Честное сравнение KoalaSync и TwoSeven. Узнайте, когда побеждает встроенная веб-камера TwoSeven и почему KoalaSync лучше всего подходит для Disney+ и Netflix.",
"ALT_TWOSEVEN_INTRO": "И KoalaSync, и TwoSeven используют один и тот же базовый подход для вечеринок просмотра: они синхронизируют исходный видеоплеер непосредственно в вашем браузере, а не передают потоковое сжатое видео из облака. Это обеспечивает высочайшее качество видео для обоих инструментов. Однако, хотя TwoSeven — это коммерческий портал со встроенным чатом с веб-камерой и уровнями подписки, KoalaSync остается минималистичным, совершенно бесплатным и безопасным для конфиденциальности расширением. Узнайте, какая услуга подходит вам лучше всего здесь.",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_TITLE": "Когда TwoSeven — лучший выбор",
"ALT_TWOSEVEN_WHEN_TWOSEVEN_BODY": "TwoSeven — правильный выбор, если вам нужно <strong>комплексное решение со встроенной веб-камерой и аудиочатом</strong> прямо в браузере. Если вы хотите видеть своих друзей во время просмотра без необходимости запуска Discord или Teamspeak в фоновом режиме, TwoSeven предлагает эту интеграцию изначально. Кроме того, он работает для YouTube и некоторых открытых веб-видеоплееров без расширений. Он хорошо подходит для небольших групп из 2–3 человек, которые хотят поделиться визуальным впечатлением во время просмотра.",
"ALT_TWOSEVEN_WHEN_KOALA_TITLE": "Когда KoalaSync подходит лучше",
"ALT_TWOSEVEN_WHEN_KOALA_BODY": "KoalaSync блистает своим <strong>полным отсутствием комиссий, конфиденциальностью и простотой</strong>:<br><br>• <strong>Нет платного доступа</strong>: чтобы синхронизировать премиум-сервисы, такие как Disney+ или Hulu, на TwoSeven, хотя бы один участник комнаты должен поддерживать их на Patreon (от 3 долларов США в месяц). KoalaSync синхронизирует Netflix, Prime Video, Disney+ и локальные медиа-серверы (Jellyfin, Plex, Emby) на 100 % бесплатно и без ограничений.<br>• <strong>Абсолютная конфиденциальность (без трекеров и рекламы)</strong>: TwoSeven поддерживается рекламой и использует несколько трекеров от Google, Facebook и других. В KoalaSync нет рекламы и трекеров, и он взаимодействует исключительно с сервером ретрансляции, работающим только в оперативной памяти.<br>• <strong>Регистрация не требуется</strong>: TwoSeven требует, чтобы все участники создали учетную запись и вошли в систему. KoalaSync полностью не требует учетной записи. Просто установите, введите код комнаты и начинайте просмотр.<br>• <strong>Легкость и экономичность</strong>. Встроенная веб-камера и аудиоканалы TwoSeven создают большую нагрузку на ваш процессор и сеть. Оставляя связь таким инструментам, как Discord, KoalaSync работает очень плавно и экономит заряд батареи.",
"ALT_TWOSEVEN_MAIN_DIFF_TITLE": "Основное отличие",
"ALT_TWOSEVEN_MAIN_DIFF_BODY": "TwoSeven  это <strong>коммерческая платформа</strong> с требованиями к регистрации, рекламой, одноранговыми чатами через веб-камеру и платным доступом Patreon для определенных потоковых сервисов. KoalaSync  это <strong>бесплатная утилита с открытым исходным кодом</strong>, которая подключается непосредственно к вкладкам вашего браузера без использования учетных записей, трекеров и дополнительных затрат, что позволяет смотреть видео в родном проигрывателе, не отвлекаясь.",
"ALT_TWOSEVEN_LIMITS_TITLE": "Честные ограничения",
"ALT_TWOSEVEN_LIMITS_BODY": "KoalaSync не предлагает <strong>нет встроенной веб-камеры или аудиочата</strong> и предполагает, что вы уже разговариваете по телефону через Discord или аналогичный инструмент. Кроме того, KoalaSync не имеет встроенного окна чата и в настоящее время доступен только для настольных компьютеров.",
"ALT_TWOSEVEN_SUMMARY_TITLE": "Суммируя",
"ALT_TWOSEVEN_SUMMARY_BODY": "TwoSeven — хороший вариант для небольших групп из двух или трех человек, которые хотят видеть друг друга через веб-камеры прямо в браузере и не против поддержать Patreon для поддержки Disney+. KoalaSync — более чистый и безопасный выбор для без рекламы, совершенно бесплатно и приватных вечеров просмотра фильмов в собственном качестве 4K (будь то Netflix, Prime Video, Disney+ или Jellyfin) без регистрации.",
"ALT_TRY_KOALASYNC": "Попробовать KoalaSync",
"MOCK_HOST_CONTROL_LABEL": "Управление ведущим",
"MOCK_HOST_CONTROL_TOGGLE": "Только я могу управлять воспроизведением",
"LABEL_SELECT_VIDEO": "Выбрать видео",
"OPTION_SELECT_TAB": "-- Выберите вкладку --",
"THEME_TOGGLE_LABEL": "Переключить светлую/тёмную тему",
"FAQ_SHOW_ALL": "Показать все вопросы",
"FAQ_HIDE_ALL": "Скрыть вопросы",
"SELF_SHOW_SETUP": "Показать инструкцию по установке",
"SELF_HIDE_SETUP": "Скрыть инструкцию",
"HERO_TRUST": "Бесплатно · Открытый код · Без аккаунта",
"COMP_MORE_GUIDES": "Полное сравнение и другие альтернативы"
}

Some files were not shown because too many files have changed in this diff Show More