Skip to content

Move localized pages to edge translation worker#607

Merged
riderx merged 2 commits into
mainfrom
codex/remove-i18n-translation-worker
May 1, 2026
Merged

Move localized pages to edge translation worker#607
riderx merged 2 commits into
mainfrom
codex/remove-i18n-translation-worker

Conversation

@riderx
Copy link
Copy Markdown
Member

@riderx riderx commented May 1, 2026

Summary

  • remove checked-in/paraglide i18n content and replace generated message imports with static English copy helpers
  • add a Cloudflare translation worker for non-English locale paths, backed by Workers AI, service bindings, and stale-while-refresh cache behavior
  • keep localized routes, canonical/alternate metadata, language selectors, and sitemap expansion while moving translated content to the edge
  • add translation worker deploy/check workflow and remove old translation workflows/scripts

Verification

  • bun run check
  • bun run build
  • bun run build:after

Summary by CodeRabbit

  • New Features

    • Edge-based translation worker deployed to serve localized content at runtime.
  • Changes

    • Removed automated translation and locale-management CI jobs; runtime translation replaces build-time automation.
    • Major removal of German documentation pages; localized content now delivered via the translation worker.
    • Language selector and locale handling made more resilient and now use real localized links.
    • Website deploy and cache rules updated to avoid unnecessary cache invalidation.
  • Documentation

    • README and contributor guidance updated to reflect the localized pages/translation worker approach.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 1, 2026

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR removes several Paraglide-based translation workflows, deletes the German docs subtree, shifts docs to runtime/edge translation via a new translation worker workflow, removes Paraglide dependencies and i18n content collections, and refactors docs components to use simple message imports with defensive locale access.

Changes

Cohort / File(s) Summary
Workflow Deletions
.github/workflows/blogs_fix_locales_all.yml, .github/workflows/blogs_remove_mismatching_locales.yml, .github/workflows/blogs_translate_all.yml, .github/workflows/blogs_translate_untranslated.yml
Removes four manual blog/translation automation workflows and their commit/push steps.
Workflow Modifications
.github/workflows/blogs_sync_seobot.yml
Removes bun run blogs:fix_locales_all and updates the commit message to omit "fix locales".
Deploy & Cache Trigger Changes
.github/workflows/deploy-docs.yml, .github/workflows/deploy-web.yml
Exclude messages/** and project.inlang/** from push triggers and from Astro cache hash inputs.
Test Workflow Updates
.github/workflows/test.yml
Adds translation change flag/output and conditional translation job that runs bun run ci:verify:translation; updates change-detection regexes and cache keys to ignore messages/** and project.inlang/**.
New Translation Deployment
.github/workflows/deploy-translation.yml
Adds workflow to verify and deploy the translation worker to Cloudflare using Bun, Node 24, caching keyed by bun.lock, frozen install, and secrets for Cloudflare.
Docs App Config & Scripts
apps/docs/astro.config.mjs, apps/docs/package.json
Removes Paraglide locale provisioning and paraglide:compile script; removes @inlang/paraglide-js and astro-i18n-aut; adds starlight-llms-txt.
Docs Components — Message Source & Robust Locale Access
apps/docs/src/components/.../FrameworkSelector.astro, apps/docs/src/components/doc/CopyPage.astro, apps/docs/src/components/doc/PluginsDirectory.astro, apps/docs/src/components/doc/InstallPromptForAI.astro
Switch message imports to @/copy/messages and wrap Astro.locals.starlightRoute access in defensive helpers returning undefined on error.
Docs Components — Localization UI & Head Links
apps/docs/src/components/doc/Head.astro, apps/docs/src/components/doc/LanguageSelect.astro
Rebuild alternate link tags using locale-aware URL computation; compute localized paths at build/client and render proper hrefs; remove client pathname-rewrite behavior.
Content Config
apps/docs/src/content.config.ts
Removes the i18n content collection, its loader, and schema.
Documentation & Tooling Docs
README.md, CLAUDE.md, _typos.toml
Update monorepo docs to mention apps/translation-worker; remove Paraglide references; adjust typo-check excludes and add allowlist words.
German Docs Removal
apps/docs/src/content/docs/de/**
Deletes entire German documentation subtree (CLI, getting-started, live-updates, plugins, FAQ, contributing, etc.; ~90+ files removed).

Sequence Diagram(s)

sequenceDiagram
  participant Trigger as Trigger (push / workflow_dispatch)
  participant GHRunner as GitHub Actions Runner
  participant Cache as Bun Cache / Runner Cache
  participant Verify as ci:verify:translation
  participant Deploy as Cloudflare Deploy (deploy:translation)
  Trigger->>GHRunner: start deploy-translation workflow
  GHRunner->>Cache: restore bun install cache (key: bun.lock)
  GHRunner->>GHRunner: setup Node 24 & Bun 1.3.11
  GHRunner->>GHRunner: bun install --frozen-lockfile
  GHRunner->>Verify: run bun run ci:verify:translation
  Verify-->>GHRunner: verification result (ok/fail)
  alt verification ok
    GHRunner->>Deploy: bun run deploy:translation (CLOUDFLARE_*)
    Deploy-->>GHRunner: deployment result (success/fail)
  else verification failed
    GHRunner-->>Trigger: abort deployment (fail)
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Poem

🐰 Hopped through workflows, trimmed the old parade,

Edge worker wakes where Paraglide once stayed.
German pages faded, messages realigned,
Guards on route access so no render's blind.
A little rabbit cheers: simpler paths, well-timed!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: moving localized pages from a Paraglide i18n system to an edge-based translation worker.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/remove-i18n-translation-worker

Review rate limit: 1/5 review remaining, refill in 43 minutes and 6 seconds.

Comment @coderabbitai help to get the list of available commands and usage tips.

@socket-security
Copy link
Copy Markdown

socket-security Bot commented May 1, 2026

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Added@​astrojs/​mdx@​5.0.3991008397100
Addedwrangler@​4.73.0981009296100
Addedvite-plugin-static-copy@​4.1.01001009695100
Addedzod@​4.4.110010010096100

View full report

@socket-security
Copy link
Copy Markdown

socket-security Bot commented May 1, 2026

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: npm miniflare is 98.0% likely obfuscated

Confidence: 0.98

Location: Package overview

From: ?npm/wrangler@4.73.0npm/miniflare@4.20260312.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/miniflare@4.20260312.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

@riderx riderx force-pushed the codex/remove-i18n-translation-worker branch from fb99570 to 2f0c419 Compare May 1, 2026 14:39
@riderx riderx force-pushed the codex/remove-i18n-translation-worker branch from 2f0c419 to 35b24b3 Compare May 1, 2026 15:03
@riderx riderx marked this pull request as ready for review May 1, 2026 15:09
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 35b24b3759

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/translation-worker/src/index.ts Outdated
headers.delete('If-Modified-Since')

return new Request(originUrl.toString(), {
method: 'GET',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve original HTTP method when proxying origin requests

createOriginRequest always builds a GET request, so any localized non-GET call (for example POST/OPTIONS to /de/...) is silently converted before reaching the origin service. This drops the original method (and request body semantics), which can break API endpoints and form submissions behind localized paths. The proxy should forward the incoming method (and body when applicable) instead of forcing GET.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (1)
_typos.toml (1)

39-41: Use extend-identifiers instead of extend-words for these legacy keys.

These tokens (Sanbox, framworks) exist as translation message identifiers in the codebase (Capacitor_Sanbox_App in apps/shared/copy/messages.ts, top_100_app_using_different_framworks_on_android_store, etc.). Placing them under extend-words suppresses them globally across all text, when they should only be ignored in identifier contexts. Move these to extend-identifiers to properly scope them as code identifiers rather than general English words.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@_typos.toml` around lines 39 - 41, The entries "Sanbox", "framworks" (and the
legacy "youre") are currently placed under extend-words and therefore suppressed
as general words; move these tokens into extend-identifiers so they are ignored
only as translation/identifier tokens (e.g., Capacitor_Sanbox_App,
top_100_app_using_different_framworks_on_android_store) rather than globally;
update _typos.toml to remove those keys from extend-words and add them under
extend-identifiers to scope the exceptions correctly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/deploy-translation.yml:
- Around line 1-23: The workflow is missing an explicit permissions block so
GITHUB_TOKEN inherits broad defaults; add a top-level permissions entry (same
level as env and jobs) that scopes GITHUB_TOKEN to least privilege — for example
set "contents: read" (or other minimal scopes required by this deploy) to limit
access; update the workflow around the existing env and jobs blocks (referencing
the workflow name "Deploy Translation Worker" and the jobs.deploy job) to
include this permissions stanza.

In `@apps/docs/src/components/doc/LanguageSelect.astro`:
- Line 54: The component is hardcoding 'en' for client-side locale routing;
update the component to accept and use the server-provided defaultLocale (in
addition to locales passed via define:vars) and replace any literal 'en'
occurrences in the locale-change logic (e.g., inside the locale switch/handler
functions or route-generation code near the current
changeLocale/handleLocaleChange logic) with the defaultLocale variable so
client-side URL generation matches server-side path generation.
- Line 25: The keyboard focus styles were removed in LanguageSelect.astro;
restore visible focus by removing the "focus:outline-none" utility from the main
control's class string and add an explicit visible focus treatment (e.g., a
focus-visible ring or outline utility) to both the main toggle and the menu item
classes referenced in this component (the button/control class on the main
element and the menu item class near the changed menu item at Line 43) so that
keyboard users get a clear focus indicator.
- Around line 39-46: The language links are not keyboard reachable because they
have tabindex="-1" and only pointer click handling; remove the tabindex="-1" (or
set tabindex="0") from the anchor with id={`language_${j}`} and any similar
anchors (the block at lines 77-95), and wire the same activation logic used for
pointer clicks to keyboard activation (handle Enter/Space via the existing click
handler or a shared activateLanguage function referenced from both on:click and
on:keydown) while keeping role="menuitem" and preserving the href from
getLocalizedPath(j) so native keyboard activation works.

In `@README.md`:
- Around line 132-133: Update the README wording for the `bun run deploy` entry
to reflect that it intentionally prevents deploying multiple workers (now `web`,
`docs`, and `translation`) at once rather than just two; mention the three
deployable targets (`web`, `docs`, `translation`) and/or instruct operators to
run the specific scoped commands (`deploy:web`, `deploy:docs`,
`deploy:translation`) instead of `bun run deploy` to avoid confusion.

---

Nitpick comments:
In `@_typos.toml`:
- Around line 39-41: The entries "Sanbox", "framworks" (and the legacy "youre")
are currently placed under extend-words and therefore suppressed as general
words; move these tokens into extend-identifiers so they are ignored only as
translation/identifier tokens (e.g., Capacitor_Sanbox_App,
top_100_app_using_different_framworks_on_android_store) rather than globally;
update _typos.toml to remove those keys from extend-words and add them under
extend-identifiers to scope the exceptions correctly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bc1704fc-73be-4fcd-b0a0-6f7e77949a76

📥 Commits

Reviewing files that changed from the base of the PR and between d229e34 and 35b24b3.

📒 Files selected for processing (300)
  • .github/workflows/blogs_fix_locales_all.yml
  • .github/workflows/blogs_remove_mismatching_locales.yml
  • .github/workflows/blogs_sync_seobot.yml
  • .github/workflows/blogs_translate_all.yml
  • .github/workflows/blogs_translate_untranslated.yml
  • .github/workflows/deploy-docs.yml
  • .github/workflows/deploy-translation.yml
  • .github/workflows/deploy-web.yml
  • .github/workflows/test.yml
  • CLAUDE.md
  • README.md
  • _typos.toml
  • apps/docs/astro.config.mjs
  • apps/docs/package.json
  • apps/docs/src/components/FrameworkSelector.astro
  • apps/docs/src/components/doc/CopyPage.astro
  • apps/docs/src/components/doc/Head.astro
  • apps/docs/src/components/doc/InstallPromptForAI.astro
  • apps/docs/src/components/doc/LanguageSelect.astro
  • apps/docs/src/components/doc/PluginsDirectory.astro
  • apps/docs/src/content.config.ts
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/android.mdx
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/credentials.mdx
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/ios.mdx
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/troubleshooting.mdx
  • apps/docs/src/content/docs/de/docs/cli/commands.mdx
  • apps/docs/src/content/docs/de/docs/cli/migrations/cli-from-0x-to-1x.mdx
  • apps/docs/src/content/docs/de/docs/cli/migrations/encryption.md
  • apps/docs/src/content/docs/de/docs/cli/overview.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/account.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/app.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/build.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/bundle.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/channel.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/doctor.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/index.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/init.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/key.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/login.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/organisation.mdx
  • apps/docs/src/content/docs/de/docs/contributing/adding-plugins.mdx
  • apps/docs/src/content/docs/de/docs/faq.mdx
  • apps/docs/src/content/docs/de/docs/getting-help.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/add-an-app.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/cicd-integration.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/deploy.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/onboarding.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/quickstart.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/troubleshooting.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/wrapping-up.mdx
  • apps/docs/src/content/docs/de/docs/how-to.mdx
  • apps/docs/src/content/docs/de/docs/index.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/breaking-changes.md
  • apps/docs/src/content/docs/de/docs/live-updates/channels.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/china-configuration.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/compliance.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/custom-storage.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/differentials.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/encryption.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/features.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/index.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/azure-devops.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/bitbucket-pipeline.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/github-actions.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/gitlab-ci.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/index.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/rollbacks.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/update-behavior.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/update-types.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/version-targeting.mdx
  • apps/docs/src/content/docs/de/docs/plugin/api.md
  • apps/docs/src/content/docs/de/docs/plugins/accelerometer/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/accelerometer/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/admob/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/admob/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/age-signals/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/age-signals/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/alarm/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/alarm/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-inline-install/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-inline-install/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-kiosk/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-kiosk/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-usagestatsmanager/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-usagestatsmanager/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/appinsights/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/appinsights/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/audio-recorder/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/audio-recorder/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/audiosession/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/audiosession/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/autofill-save-password/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/autofill-save-password/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/background-geolocation/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/background-geolocation/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/barometer/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/barometer/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/camera-preview/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/camera-preview/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/capacitor-plus/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/capacitor-plus/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/compass/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/compass/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/contacts/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/contacts/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/crisp/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/crisp/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/data-storage-sqlite/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/data-storage-sqlite/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/document-scanner/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/document-scanner/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/downloader/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/downloader/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/env/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/env/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/fast-sql/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/fast-sql/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/ffmpeg/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/ffmpeg/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/file-compressor/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/file-compressor/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/file/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/file/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/flash/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/flash/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/gtm/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/gtm/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/health/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/health/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/home-indicator/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/home-indicator/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/ibeacon/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/ibeacon/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/inappbrowser/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/inappbrowser/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/is-root/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/is-root/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/ivs-player/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/ivs-player/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/jw-player/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/jw-player/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/launch-navigator/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/launch-navigator/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/live-reload/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/live-reload/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/llm/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/llm/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/media-session/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/media-session/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/mute/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/mute/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/mux-player/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/mux-player/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-audio/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-audio/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-biometric/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-biometric/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-market/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-market/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/android-create-subscription.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/android-introductory-offer.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/android-play-store-review.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/android-sandbox-testing.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-app-store-review.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-create-subscription.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-introductory-offer.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-sandbox-testing.mdx
  • apps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-subscription-group.mdx
  • apps/docs/src/content/docs/de/docs/plugins/nativegeocoder/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/nativegeocoder/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/navigation-bar/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/navigation-bar/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/nfc/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/nfc/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/pay/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/pay/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/pdf-generator/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/pdf-generator/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/pedometer/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/pedometer/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/persistent-account/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/persistent-account/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/photo-library/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/photo-library/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/printer/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/printer/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/realtimekit/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/realtimekit/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/ricoh360-camera/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/ricoh360-camera/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/screen-orientation/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/screen-orientation/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/screen-recorder/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/screen-recorder/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/shake/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/shake/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/share-target/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/share-target/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/sim/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/sim/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/apple/android.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/apple/general.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/apple/ios.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/apple/web.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/facebook.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/firebase/google/android.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/firebase/google/general.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/firebase/google/ios.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/firebase/google/web.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/firebase/introduction.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/google/android.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/google/general.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/google/ios.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/google/web.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/migrations/apple.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/migrations/facebook.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/migrations/google.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/migrations/v7.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/supabase/Apple/android.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/supabase/Apple/general.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/supabase/Apple/ios.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/supabase/Apple/web.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/supabase/google/android.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/supabase/google/general.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/supabase/google/ios.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/supabase/google/web.mdx
  • apps/docs/src/content/docs/de/docs/plugins/social-login/supabase/introduction.mdx
  • apps/docs/src/content/docs/de/docs/plugins/speech-recognition/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/speech-recognition/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/speech-synthesis/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/speech-synthesis/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/streamcall/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/streamcall/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/textinteraction/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/textinteraction/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/twilio-voice/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/twilio-voice/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/api.md
  • apps/docs/src/content/docs/de/docs/plugins/updater/cordova.md
  • apps/docs/src/content/docs/de/docs/plugins/updater/debugging.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/events.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/known-issues.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/local-dev/capacitor-updater.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/local-dev/cli.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/local-dev/contributing.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/local-dev/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/notify-app-ready.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/auto-update.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/encrypted-bundles.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/handling-channels.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/handling-stats.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/handling-updates.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/manual-update.mdx
  • apps/docs/src/content/docs/de/docs/plugins/updater/settings.mdx
  • apps/docs/src/content/docs/de/docs/plugins/uploader/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/uploader/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/video-player/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/video-player/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/volume-buttons/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/volume-buttons/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/wechat/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/wechat/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/wifi/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/wifi/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/youtube-player/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/youtube-player/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/zip/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/zip/index.mdx
  • apps/docs/src/content/docs/de/docs/public-api/api-keys.mdx
  • apps/docs/src/content/docs/de/docs/public-api/app.mdx
  • apps/docs/src/content/docs/de/docs/public-api/bundles.mdx
  • apps/docs/src/content/docs/de/docs/public-api/channels.mdx
  • apps/docs/src/content/docs/de/docs/public-api/devices.mdx
  • apps/docs/src/content/docs/de/docs/public-api/index.mdx
  • apps/docs/src/content/docs/de/docs/public-api/members.mdx
  • apps/docs/src/content/docs/de/docs/public-api/organizations.mdx
  • apps/docs/src/content/docs/de/docs/public-api/statistics.mdx
  • apps/docs/src/content/docs/de/docs/upgrade/from-appflow-to-capgo.mdx
  • apps/docs/src/content/docs/de/docs/upgrade/from-capawesome-to-capgo.mdx
  • apps/docs/src/content/docs/de/docs/upgrade/from-v2-to-v3.md
  • apps/docs/src/content/docs/de/docs/upgrade/from-v3-to-v4.md
  • apps/docs/src/content/docs/de/docs/upgrade/from-v4-to-v5.md
  • apps/docs/src/content/docs/de/docs/upgrade/from-v5-to-v6.md
  • apps/docs/src/content/docs/de/docs/upgrade/from-v6-to-v7.md
  • apps/docs/src/content/docs/de/docs/upgrade/from-v7-to-v8.md
  • apps/docs/src/content/docs/de/docs/webapp/api-keys.mdx
  • apps/docs/src/content/docs/de/docs/webapp/bundles.mdx
  • apps/docs/src/content/docs/de/docs/webapp/channels.mdx
  • apps/docs/src/content/docs/de/docs/webapp/devices.mdx
  • apps/docs/src/content/docs/de/docs/webapp/index.mdx
  • apps/docs/src/content/docs/de/docs/webapp/logs.mdx
💤 Files with no reviewable changes (99)
  • apps/docs/src/content/docs/de/docs/index.mdx
  • apps/docs/src/content/docs/de/docs/how-to.mdx
  • apps/docs/src/content/docs/de/docs/cli/migrations/cli-from-0x-to-1x.mdx
  • apps/docs/src/content/docs/de/docs/plugins/audiosession/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/login.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-inline-install/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/crisp/index.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/doctor.mdx
  • apps/docs/src/content/docs/de/docs/cli/commands.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/key.mdx
  • apps/docs/src/content/docs/de/docs/plugins/downloader/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/data-storage-sqlite/index.mdx
  • .github/workflows/blogs_translate_all.yml
  • .github/workflows/blogs_translate_untranslated.yml
  • apps/docs/src/content/docs/de/docs/cli/reference/bundle.mdx
  • apps/docs/src/content/docs/de/docs/getting-help.mdx
  • apps/docs/src/content/docs/de/docs/plugins/background-geolocation/index.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/organisation.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/app.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/differentials.mdx
  • apps/docs/src/content/docs/de/docs/plugins/audio-recorder/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-kiosk/index.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/rollbacks.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/update-behavior.mdx
  • apps/docs/src/content/docs/de/docs/plugins/data-storage-sqlite/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/env/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/audiosession/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-usagestatsmanager/index.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/version-targeting.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/camera-preview/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/admob/index.mdx
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/credentials.mdx
  • apps/docs/src/content/docs/de/docs/plugins/appinsights/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/wrapping-up.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/quickstart.mdx
  • apps/docs/src/content/docs/de/docs/plugins/admob/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/capacitor-plus/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/audio-recorder/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/document-scanner/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/accelerometer/index.mdx
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/troubleshooting.mdx
  • apps/docs/src/content/docs/de/docs/plugins/alarm/index.mdx
  • .github/workflows/blogs_remove_mismatching_locales.yml
  • apps/docs/src/content/docs/de/docs/live-updates/breaking-changes.md
  • apps/docs/src/content/docs/de/docs/live-updates/custom-storage.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/azure-devops.mdx
  • apps/docs/src/content/docs/de/docs/cli/overview.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/build.mdx
  • apps/docs/src/content/docs/de/docs/plugins/contacts/index.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/compliance.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/features.mdx
  • apps/docs/src/content/docs/de/docs/plugins/document-scanner/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/autofill-save-password/index.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/index.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/onboarding.mdx
  • apps/docs/src/content/docs/de/docs/plugins/env/index.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/index.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/deploy.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-kiosk/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/crisp/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/capacitor-plus/index.mdx
  • apps/docs/src/content/docs/de/docs/cli/migrations/encryption.md
  • apps/docs/src/content/docs/de/docs/plugins/barometer/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/cicd-integration.mdx
  • apps/docs/src/content/docs/de/docs/plugins/accelerometer/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/compass/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/contacts/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/age-signals/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/update-types.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/encryption.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/channels.mdx
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/android.mdx
  • apps/docs/src/content/docs/de/docs/contributing/adding-plugins.mdx
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/faq.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/troubleshooting.mdx
  • apps/docs/src/content/docs/de/docs/plugins/appinsights/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/compass/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/camera-preview/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/getting-started/add-an-app.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/github-actions.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/china-configuration.mdx
  • apps/docs/src/content/docs/de/docs/plugins/autofill-save-password/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/age-signals/index.mdx
  • apps/docs/src/content/docs/de/docs/plugins/downloader/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/init.mdx
  • apps/docs/src/content/docs/de/docs/plugins/barometer/index.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/account.mdx
  • apps/docs/src/content/docs/de/docs/plugins/background-geolocation/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugins/alarm/getting-started.mdx
  • .github/workflows/blogs_fix_locales_all.yml
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/gitlab-ci.mdx
  • apps/docs/src/content/docs/de/docs/cli/cloud-build/ios.mdx
  • apps/docs/src/content/docs/de/docs/plugins/android-inline-install/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/plugin/api.md
  • apps/docs/src/content/docs/de/docs/plugins/android-usagestatsmanager/getting-started.mdx
  • apps/docs/src/content/docs/de/docs/live-updates/integrations/bitbucket-pipeline.mdx
  • apps/docs/src/content/docs/de/docs/cli/reference/channel.mdx

Comment thread .github/workflows/deploy-translation.yml
Comment thread apps/docs/src/components/doc/LanguageSelect.astro Outdated
Comment thread apps/docs/src/components/doc/LanguageSelect.astro
Comment thread apps/docs/src/components/doc/LanguageSelect.astro Outdated
Comment thread README.md Outdated
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented May 1, 2026

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 787a98bce0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +422 to +423
const tagEnd = html.indexOf('>', index + 1)
if (tagEnd === -1) return null
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P0 Badge Parse tags past quoted > characters

findNextHtmlTag uses html.indexOf('>') to terminate a tag, which stops inside quoted attribute values. Our generated markup includes class values like [&>svg]:... (for example in apps/web/src/components/Footer.astro), so localized pages will have tags split mid-attribute and the remainder treated as translatable text, corrupting the HTML output. The tag scanner must skip > characters that are inside quotes.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in follow-up PR #608: #608

}

async function refreshCache(request: Request, env: Env, requestUrl: URL, locale: Locale, cacheKey: Request): Promise<Response> {
const response = await buildTranslatedResponse(request, env, requestUrl, locale)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Avoid caching translations generated from HEAD requests

refreshCache builds and stores translated HTML using the incoming request verb; when that verb is HEAD, buildTranslatedResponse reads an empty body and still writes it to cache. A first-time or stale refresh triggered by HEAD can therefore replace a valid localized page with an empty/malformed cached document for subsequent GET traffic. Cache refresh should always fetch/render with a GET request (or skip cache writes for HEAD).

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in follow-up PR #608: #608

@riderx riderx merged commit 4b8bab4 into main May 1, 2026
9 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant