Move localized pages to edge translation worker#607
Conversation
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughThis 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
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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Review rate limit: 1/5 review remaining, refill in 43 minutes and 6 seconds. Comment |
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
|
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.
|
fb99570 to
2f0c419
Compare
2f0c419 to
35b24b3
Compare
There was a problem hiding this comment.
💡 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".
| headers.delete('If-Modified-Since') | ||
|
|
||
| return new Request(originUrl.toString(), { | ||
| method: 'GET', |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 5
🧹 Nitpick comments (1)
_typos.toml (1)
39-41: Useextend-identifiersinstead ofextend-wordsfor these legacy keys.These tokens (
Sanbox,framworks) exist as translation message identifiers in the codebase (Capacitor_Sanbox_Appinapps/shared/copy/messages.ts,top_100_app_using_different_framworks_on_android_store, etc.). Placing them underextend-wordssuppresses them globally across all text, when they should only be ignored in identifier contexts. Move these toextend-identifiersto 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
📒 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.ymlCLAUDE.mdREADME.md_typos.tomlapps/docs/astro.config.mjsapps/docs/package.jsonapps/docs/src/components/FrameworkSelector.astroapps/docs/src/components/doc/CopyPage.astroapps/docs/src/components/doc/Head.astroapps/docs/src/components/doc/InstallPromptForAI.astroapps/docs/src/components/doc/LanguageSelect.astroapps/docs/src/components/doc/PluginsDirectory.astroapps/docs/src/content.config.tsapps/docs/src/content/docs/de/docs/cli/cloud-build/android.mdxapps/docs/src/content/docs/de/docs/cli/cloud-build/credentials.mdxapps/docs/src/content/docs/de/docs/cli/cloud-build/getting-started.mdxapps/docs/src/content/docs/de/docs/cli/cloud-build/ios.mdxapps/docs/src/content/docs/de/docs/cli/cloud-build/troubleshooting.mdxapps/docs/src/content/docs/de/docs/cli/commands.mdxapps/docs/src/content/docs/de/docs/cli/migrations/cli-from-0x-to-1x.mdxapps/docs/src/content/docs/de/docs/cli/migrations/encryption.mdapps/docs/src/content/docs/de/docs/cli/overview.mdxapps/docs/src/content/docs/de/docs/cli/reference/account.mdxapps/docs/src/content/docs/de/docs/cli/reference/app.mdxapps/docs/src/content/docs/de/docs/cli/reference/build.mdxapps/docs/src/content/docs/de/docs/cli/reference/bundle.mdxapps/docs/src/content/docs/de/docs/cli/reference/channel.mdxapps/docs/src/content/docs/de/docs/cli/reference/doctor.mdxapps/docs/src/content/docs/de/docs/cli/reference/index.mdxapps/docs/src/content/docs/de/docs/cli/reference/init.mdxapps/docs/src/content/docs/de/docs/cli/reference/key.mdxapps/docs/src/content/docs/de/docs/cli/reference/login.mdxapps/docs/src/content/docs/de/docs/cli/reference/organisation.mdxapps/docs/src/content/docs/de/docs/contributing/adding-plugins.mdxapps/docs/src/content/docs/de/docs/faq.mdxapps/docs/src/content/docs/de/docs/getting-help.mdxapps/docs/src/content/docs/de/docs/getting-started/add-an-app.mdxapps/docs/src/content/docs/de/docs/getting-started/cicd-integration.mdxapps/docs/src/content/docs/de/docs/getting-started/deploy.mdxapps/docs/src/content/docs/de/docs/getting-started/onboarding.mdxapps/docs/src/content/docs/de/docs/getting-started/quickstart.mdxapps/docs/src/content/docs/de/docs/getting-started/troubleshooting.mdxapps/docs/src/content/docs/de/docs/getting-started/wrapping-up.mdxapps/docs/src/content/docs/de/docs/how-to.mdxapps/docs/src/content/docs/de/docs/index.mdxapps/docs/src/content/docs/de/docs/live-updates/breaking-changes.mdapps/docs/src/content/docs/de/docs/live-updates/channels.mdxapps/docs/src/content/docs/de/docs/live-updates/china-configuration.mdxapps/docs/src/content/docs/de/docs/live-updates/compliance.mdxapps/docs/src/content/docs/de/docs/live-updates/custom-storage.mdxapps/docs/src/content/docs/de/docs/live-updates/differentials.mdxapps/docs/src/content/docs/de/docs/live-updates/encryption.mdxapps/docs/src/content/docs/de/docs/live-updates/features.mdxapps/docs/src/content/docs/de/docs/live-updates/index.mdxapps/docs/src/content/docs/de/docs/live-updates/integrations/azure-devops.mdxapps/docs/src/content/docs/de/docs/live-updates/integrations/bitbucket-pipeline.mdxapps/docs/src/content/docs/de/docs/live-updates/integrations/github-actions.mdxapps/docs/src/content/docs/de/docs/live-updates/integrations/gitlab-ci.mdxapps/docs/src/content/docs/de/docs/live-updates/integrations/index.mdxapps/docs/src/content/docs/de/docs/live-updates/rollbacks.mdxapps/docs/src/content/docs/de/docs/live-updates/update-behavior.mdxapps/docs/src/content/docs/de/docs/live-updates/update-types.mdxapps/docs/src/content/docs/de/docs/live-updates/version-targeting.mdxapps/docs/src/content/docs/de/docs/plugin/api.mdapps/docs/src/content/docs/de/docs/plugins/accelerometer/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/accelerometer/index.mdxapps/docs/src/content/docs/de/docs/plugins/admob/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/admob/index.mdxapps/docs/src/content/docs/de/docs/plugins/age-signals/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/age-signals/index.mdxapps/docs/src/content/docs/de/docs/plugins/alarm/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/alarm/index.mdxapps/docs/src/content/docs/de/docs/plugins/android-inline-install/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/android-inline-install/index.mdxapps/docs/src/content/docs/de/docs/plugins/android-kiosk/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/android-kiosk/index.mdxapps/docs/src/content/docs/de/docs/plugins/android-usagestatsmanager/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/android-usagestatsmanager/index.mdxapps/docs/src/content/docs/de/docs/plugins/appinsights/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/appinsights/index.mdxapps/docs/src/content/docs/de/docs/plugins/audio-recorder/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/audio-recorder/index.mdxapps/docs/src/content/docs/de/docs/plugins/audiosession/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/audiosession/index.mdxapps/docs/src/content/docs/de/docs/plugins/autofill-save-password/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/autofill-save-password/index.mdxapps/docs/src/content/docs/de/docs/plugins/background-geolocation/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/background-geolocation/index.mdxapps/docs/src/content/docs/de/docs/plugins/barometer/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/barometer/index.mdxapps/docs/src/content/docs/de/docs/plugins/camera-preview/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/camera-preview/index.mdxapps/docs/src/content/docs/de/docs/plugins/capacitor-plus/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/capacitor-plus/index.mdxapps/docs/src/content/docs/de/docs/plugins/compass/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/compass/index.mdxapps/docs/src/content/docs/de/docs/plugins/contacts/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/contacts/index.mdxapps/docs/src/content/docs/de/docs/plugins/crisp/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/crisp/index.mdxapps/docs/src/content/docs/de/docs/plugins/data-storage-sqlite/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/data-storage-sqlite/index.mdxapps/docs/src/content/docs/de/docs/plugins/document-scanner/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/document-scanner/index.mdxapps/docs/src/content/docs/de/docs/plugins/downloader/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/downloader/index.mdxapps/docs/src/content/docs/de/docs/plugins/env/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/env/index.mdxapps/docs/src/content/docs/de/docs/plugins/fast-sql/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/fast-sql/index.mdxapps/docs/src/content/docs/de/docs/plugins/ffmpeg/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/ffmpeg/index.mdxapps/docs/src/content/docs/de/docs/plugins/file-compressor/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/file-compressor/index.mdxapps/docs/src/content/docs/de/docs/plugins/file/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/file/index.mdxapps/docs/src/content/docs/de/docs/plugins/flash/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/flash/index.mdxapps/docs/src/content/docs/de/docs/plugins/gtm/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/gtm/index.mdxapps/docs/src/content/docs/de/docs/plugins/health/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/health/index.mdxapps/docs/src/content/docs/de/docs/plugins/home-indicator/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/home-indicator/index.mdxapps/docs/src/content/docs/de/docs/plugins/ibeacon/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/ibeacon/index.mdxapps/docs/src/content/docs/de/docs/plugins/inappbrowser/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/inappbrowser/index.mdxapps/docs/src/content/docs/de/docs/plugins/index.mdxapps/docs/src/content/docs/de/docs/plugins/is-root/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/is-root/index.mdxapps/docs/src/content/docs/de/docs/plugins/ivs-player/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/ivs-player/index.mdxapps/docs/src/content/docs/de/docs/plugins/jw-player/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/jw-player/index.mdxapps/docs/src/content/docs/de/docs/plugins/launch-navigator/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/launch-navigator/index.mdxapps/docs/src/content/docs/de/docs/plugins/live-reload/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/live-reload/index.mdxapps/docs/src/content/docs/de/docs/plugins/llm/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/llm/index.mdxapps/docs/src/content/docs/de/docs/plugins/media-session/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/media-session/index.mdxapps/docs/src/content/docs/de/docs/plugins/mute/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/mute/index.mdxapps/docs/src/content/docs/de/docs/plugins/mux-player/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/mux-player/index.mdxapps/docs/src/content/docs/de/docs/plugins/native-audio/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/native-audio/index.mdxapps/docs/src/content/docs/de/docs/plugins/native-biometric/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/native-biometric/index.mdxapps/docs/src/content/docs/de/docs/plugins/native-market/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/native-market/index.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/android-create-subscription.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/android-introductory-offer.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/android-play-store-review.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/android-sandbox-testing.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/index.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-app-store-review.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-create-subscription.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-introductory-offer.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-sandbox-testing.mdxapps/docs/src/content/docs/de/docs/plugins/native-purchases/ios-subscription-group.mdxapps/docs/src/content/docs/de/docs/plugins/nativegeocoder/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/nativegeocoder/index.mdxapps/docs/src/content/docs/de/docs/plugins/navigation-bar/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/navigation-bar/index.mdxapps/docs/src/content/docs/de/docs/plugins/nfc/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/nfc/index.mdxapps/docs/src/content/docs/de/docs/plugins/pay/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/pay/index.mdxapps/docs/src/content/docs/de/docs/plugins/pdf-generator/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/pdf-generator/index.mdxapps/docs/src/content/docs/de/docs/plugins/pedometer/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/pedometer/index.mdxapps/docs/src/content/docs/de/docs/plugins/persistent-account/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/persistent-account/index.mdxapps/docs/src/content/docs/de/docs/plugins/photo-library/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/photo-library/index.mdxapps/docs/src/content/docs/de/docs/plugins/printer/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/printer/index.mdxapps/docs/src/content/docs/de/docs/plugins/realtimekit/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/realtimekit/index.mdxapps/docs/src/content/docs/de/docs/plugins/ricoh360-camera/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/ricoh360-camera/index.mdxapps/docs/src/content/docs/de/docs/plugins/screen-orientation/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/screen-orientation/index.mdxapps/docs/src/content/docs/de/docs/plugins/screen-recorder/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/screen-recorder/index.mdxapps/docs/src/content/docs/de/docs/plugins/shake/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/shake/index.mdxapps/docs/src/content/docs/de/docs/plugins/share-target/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/share-target/index.mdxapps/docs/src/content/docs/de/docs/plugins/sim/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/sim/index.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/apple/android.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/apple/general.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/apple/ios.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/apple/web.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/facebook.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/firebase/google/android.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/firebase/google/general.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/firebase/google/ios.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/firebase/google/web.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/firebase/introduction.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/google/android.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/google/general.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/google/ios.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/google/web.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/index.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/migrations/apple.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/migrations/facebook.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/migrations/google.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/migrations/v7.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/supabase/Apple/android.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/supabase/Apple/general.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/supabase/Apple/ios.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/supabase/Apple/web.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/supabase/google/android.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/supabase/google/general.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/supabase/google/ios.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/supabase/google/web.mdxapps/docs/src/content/docs/de/docs/plugins/social-login/supabase/introduction.mdxapps/docs/src/content/docs/de/docs/plugins/speech-recognition/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/speech-recognition/index.mdxapps/docs/src/content/docs/de/docs/plugins/speech-synthesis/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/speech-synthesis/index.mdxapps/docs/src/content/docs/de/docs/plugins/streamcall/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/streamcall/index.mdxapps/docs/src/content/docs/de/docs/plugins/textinteraction/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/textinteraction/index.mdxapps/docs/src/content/docs/de/docs/plugins/twilio-voice/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/twilio-voice/index.mdxapps/docs/src/content/docs/de/docs/plugins/updater/api.mdapps/docs/src/content/docs/de/docs/plugins/updater/cordova.mdapps/docs/src/content/docs/de/docs/plugins/updater/debugging.mdxapps/docs/src/content/docs/de/docs/plugins/updater/events.mdxapps/docs/src/content/docs/de/docs/plugins/updater/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/updater/index.mdxapps/docs/src/content/docs/de/docs/plugins/updater/known-issues.mdxapps/docs/src/content/docs/de/docs/plugins/updater/local-dev/capacitor-updater.mdxapps/docs/src/content/docs/de/docs/plugins/updater/local-dev/cli.mdxapps/docs/src/content/docs/de/docs/plugins/updater/local-dev/contributing.mdxapps/docs/src/content/docs/de/docs/plugins/updater/local-dev/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/updater/notify-app-ready.mdxapps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/auto-update.mdxapps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/encrypted-bundles.mdxapps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/handling-channels.mdxapps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/handling-stats.mdxapps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/handling-updates.mdxapps/docs/src/content/docs/de/docs/plugins/updater/self-hosted/manual-update.mdxapps/docs/src/content/docs/de/docs/plugins/updater/settings.mdxapps/docs/src/content/docs/de/docs/plugins/uploader/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/uploader/index.mdxapps/docs/src/content/docs/de/docs/plugins/video-player/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/video-player/index.mdxapps/docs/src/content/docs/de/docs/plugins/volume-buttons/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/volume-buttons/index.mdxapps/docs/src/content/docs/de/docs/plugins/wechat/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/wechat/index.mdxapps/docs/src/content/docs/de/docs/plugins/wifi/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/wifi/index.mdxapps/docs/src/content/docs/de/docs/plugins/youtube-player/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/youtube-player/index.mdxapps/docs/src/content/docs/de/docs/plugins/zip/getting-started.mdxapps/docs/src/content/docs/de/docs/plugins/zip/index.mdxapps/docs/src/content/docs/de/docs/public-api/api-keys.mdxapps/docs/src/content/docs/de/docs/public-api/app.mdxapps/docs/src/content/docs/de/docs/public-api/bundles.mdxapps/docs/src/content/docs/de/docs/public-api/channels.mdxapps/docs/src/content/docs/de/docs/public-api/devices.mdxapps/docs/src/content/docs/de/docs/public-api/index.mdxapps/docs/src/content/docs/de/docs/public-api/members.mdxapps/docs/src/content/docs/de/docs/public-api/organizations.mdxapps/docs/src/content/docs/de/docs/public-api/statistics.mdxapps/docs/src/content/docs/de/docs/upgrade/from-appflow-to-capgo.mdxapps/docs/src/content/docs/de/docs/upgrade/from-capawesome-to-capgo.mdxapps/docs/src/content/docs/de/docs/upgrade/from-v2-to-v3.mdapps/docs/src/content/docs/de/docs/upgrade/from-v3-to-v4.mdapps/docs/src/content/docs/de/docs/upgrade/from-v4-to-v5.mdapps/docs/src/content/docs/de/docs/upgrade/from-v5-to-v6.mdapps/docs/src/content/docs/de/docs/upgrade/from-v6-to-v7.mdapps/docs/src/content/docs/de/docs/upgrade/from-v7-to-v8.mdapps/docs/src/content/docs/de/docs/webapp/api-keys.mdxapps/docs/src/content/docs/de/docs/webapp/bundles.mdxapps/docs/src/content/docs/de/docs/webapp/channels.mdxapps/docs/src/content/docs/de/docs/webapp/devices.mdxapps/docs/src/content/docs/de/docs/webapp/index.mdxapps/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
|
There was a problem hiding this comment.
💡 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".
| const tagEnd = html.indexOf('>', index + 1) | ||
| if (tagEnd === -1) return null |
There was a problem hiding this comment.
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 👍 / 👎.
| } | ||
|
|
||
| async function refreshCache(request: Request, env: Env, requestUrl: URL, locale: Locale, cacheKey: Request): Promise<Response> { | ||
| const response = await buildTranslatedResponse(request, env, requestUrl, locale) |
There was a problem hiding this comment.
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 👍 / 👎.



Summary
Verification
Summary by CodeRabbit
New Features
Changes
Documentation