Skip to content

Add Czech locale to client and docs#919

Open
lukyrys wants to merge 21 commits into
rybbit-io:masterfrom
lukyrys:czech-translations
Open

Add Czech locale to client and docs#919
lukyrys wants to merge 21 commits into
rybbit-io:masterfrom
lukyrys:czech-translations

Conversation

@lukyrys
Copy link
Copy Markdown
Contributor

@lukyrys lukyrys commented Feb 26, 2026

Summary

Adds full Czech (cs) localization to both the client app and the docs site, registering it in every place the existing 9 locales are listed.

Changes

Client (client/)

  • messages/cs.json — 170 strings translated to Czech (informal "ty/tvůj" tone matching the existing en.json voice)
  • scripts/extract-messages.mjs — add cs to the locales list so future extracts include it

Docs (docs/)

  • messages/cs.json — new file, all 366 strings translated
  • scripts/extract-messages.mjs — add cs to extract locales
  • src/i18n/routing.ts — add cs to next-intl routing locales
  • src/lib/i18n.ts — add cs to fumadocs defineI18n languages
  • src/components/LanguageSwitcher.tsx — add Czech entry (Čeština, country CZ)

CI workflows

  • .github/workflows/translate.yml & translate-docs.yml — add cs.json to the language loop and the language mapping comment so the existing translation automation also covers Czech

Notes

  • en.json kept identical to upstream (the diff was an accidental key-reorder
    artifact from extract-messages, no semantic change). See commit
    be98d13a.
  • 45 keys in client/messages/cs.json and 20 in docs/messages/cs.json
    remain identical to en.json on purpose — they are brand names (GitHub,
    Google, Discord, Web Vitals…), tech abbreviations (UTM, ASN, VPN, OS,
    CTR…), plan tiers (Pro, Standard, Enterprise…), or words that are
    identical in Czech (Region, Tablet, Data, Role…).
  • Empty translations: 0 / 1219 (client), 0 / 366 (docs)
  • Missing keys vs en.json: 0 (both)

Test plan

  • npm run extract:messages (client) — produces no diff in cs.json
  • npm run extract:messages (docs) — produces no diff in cs.json
  • Open the docs site at /cs — language switcher shows "Čeština"
  • Switch the client UI to Czech — strings resolve to translations, no English fallbacks except for the legitimate 45 brand/tech terms above

@vercel
Copy link
Copy Markdown

vercel Bot commented Feb 26, 2026

@lukyrys is attempting to deploy a commit to the goldflag's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 26, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds Czech locale support across docs and client, bulk-adds time-interval translation keys to many locales, introduces two translation helper scripts, updates extraction and CI workflows to include cs, and refactors BucketSelection to use component-scoped translations with expanded bucket/time branching.

Changes

Cohort / File(s) Summary
Workflows
/.github/workflows/translate.yml, /.github/workflows/translate-docs.yml
Include cs.json in non‑English translation lists and language mappings; update prompts/documentation to list Czech.
Extraction Scripts
client/scripts/extract-messages.mjs, docs/scripts/extract-messages.mjs
Add cs to locales arrays so Czech messages are extracted.
Translation helper scripts
client/messages/check_translations.py, client/messages/update_translations.py
Add check_translations.py (validates empty/missing/stale/untranslated keys) and update_translations.py (applies translations, reorders locale JSONs to match en.json, writes files).
Locale Files — Czech (client & docs)
client/messages/cs.json, docs/messages/cs.json
New/expanded Czech translations: many UI strings populated (plans, onboarding, org/web, time labels, etc.). Large new docs/messages file added.
Locale Files — Time Units (multiple locales)
client/messages/en.json, client/messages/de.json, client/messages/es.json, client/messages/fr.json, client/messages/it.json, client/messages/ja.json, client/messages/ko.json, client/messages/pl.json, client/messages/pt.json, client/messages/zh.json
Add eight time-unit keys (A4AHkc, JIOFW/, 6uQnsi, IoiMPE, b11WUZ, 7pXrnq, sd2ieZ, TBovrx) across languages; minor reordering/formatting of an unrelated key.
Docs locale UI
docs/src/components/LanguageSwitcher.tsx, docs/src/i18n/routing.ts
Add Czech locale option and include cs in routing locales.
Component refactor
client/src/components/BucketSelection.tsx
Export BucketSelection; shift translation accessor (t) into component via useExtracted(); change getOptions to close over t and accept only time; expand time-mode branching and add range handling with richer option sets.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐇 I found a tiny "cs" beneath a log,

Min to Month now dancing through the fog.
Buckets opened wider, options hopped in line,
I stitched each string, one carrot at a time.
A soft thump — translations snug and fine.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add Czech locale to client and docs' directly and clearly describes the primary changes across the changeset, which involve adding Czech (cs) locale support to translation files, extraction scripts, and routing configurations.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

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: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
client/src/components/BucketSelection.tsx (1)

6-6: ⚠️ Potential issue | 🟠 Major

Change useExtracted() to useTranslations() to align with client/src guidelines.

The file is located in client/src/components/, which requires using useTranslations() per the coding guidelines. While useExtracted() is designed for automatic inline message extraction and is intended for docs components, this file should follow the client/src pattern. If the inline message extraction workflow is needed, update the component to use useTranslations() with key-based message references instead.

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

In `@client/src/components/BucketSelection.tsx` at line 6, Replace useExtracted
with useTranslations in the BucketSelection component: update the import from
"next-intl" to import { useTranslations } and replace any call sites of
useExtracted() with useTranslations(<namespaceOrKey>) (e.g., const t =
useTranslations("BucketSelection") or appropriate namespace), then change inline
message references to use key-based lookups (t("yourKey")) instead of inline
extraction. Ensure the component's message keys are added to the locale JSON
under the chosen namespace and remove any extraction-specific usages that only
apply to useExtracted.
🧹 Nitpick comments (1)
client/messages/check_translations.py (1)

12-22: Return a failing exit code when issues are found.

As written, this validator always exits successfully, so it can’t gate CI even when empty/missing/stale keys are detected.

💡 Suggested fix
 files = ['cs.json', 'zh.json', 'ja.json', 'de.json', 'pl.json', 'pt.json', 'it.json', 'fr.json', 'ko.json', 'es.json']
+has_issues = False
 
 for fname in files:
@@
     english = [k for k, v in trans.items() if k in en and v == en[k] and v != '']
+    file_has_issues = bool(empty or stale or missing or english)
+    has_issues = has_issues or file_has_issues
@@
     print(f'  Still English (same as en.json): {english}')
     print()
+
+raise SystemExit(1 if has_issues else 0)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@client/messages/check_translations.py` around lines 12 - 22, The script
currently only prints findings (variables empty, stale, missing, english for
each fname) and never fails CI; modify the validator so that after printing the
report for a file (after the print() block that outputs fname and the lists) it
checks if any of empty, stale, missing, or english are non-empty and, if so,
calls sys.exit(1) (or raises SystemExit(1)) to return a failing exit code; add
an import sys at the top if not present and ensure the check runs for the
overall run (e.g., track a flag or perform the exit after each file) so the
process exits non-zero when issues are found.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@client/messages/check_translations.py`:
- Around line 3-4: The file opens 'en.json' (and the other JSON files around it)
using a relative path which breaks if the process CWD is not client/messages;
change these file opens to use a script-relative path by building the path from
Path(__file__).resolve().parent and joining the filename (e.g.,
Path(__file__).resolve().parent / 'en.json') before calling open() or
json.load(); update both occurrences that currently open 'en.json' and the other
translation file so they use this script-relative Path to avoid CWD-dependent
failures.

In `@client/messages/cs.json`:
- Around line 290-291: Replace the English word "funnel" in the cs.json
translation value for key "mV7XLc" with the Czech term "trychtýř" to match the
locale terminology; update the string for "mV7XLc" so it reads something like
"Vytvořte svůj první trychtýř pro sledování konverzí v uživatelské cestě na
vašem webu." and ensure spacing and punctuation remain consistent with
surrounding entries.

In `@client/messages/ko.json`:
- Around line 1167-1169: The three Korean translation entries for keys "JIOFW/",
"6uQnsi", and "IoiMPE" incorrectly use the Chinese/Japanese character "分";
update their values to use the correct Korean "분" (e.g., "5분", "10분", "15분") so
they match the neighboring correct translation for "Min" and maintain
consistency across the translations.

In `@client/messages/update_translations.py`:
- Around line 65-66: The code in update_translations.py opens JSON files using
relative paths (e.g., the en.json read around the en_content usage and other
reads/writes near lines 72–73 and 90–92), which depends on the current working
directory; change those file operations to build paths relative to the script
location by resolving Path(__file__).parent and joining the filenames (e.g.,
en.json, other JSONs, and any output files) so all open/read/write calls use
that resolved directory (update the code that reads en_content and the
subsequent file opens to use the script-dir-based Path).
- Around line 6-62: The translations dict in
client/messages/update_translations.py omits the new Czech locale; add a
'cs.json' entry to the translations mapping (the same dict that contains
'zh.json','ja.json',etc.) and populate it with the same message keys used
elsewhere (e.g. 'rd5F5r','5/hIKX','BdV5Om','HCYBYT' and, if needed, 'u9xEkD') so
Czech is included in the update target list; ensure the new 'cs.json' block
follows the same structure and key set as the other language entries.

In `@client/src/components/BucketSelection.tsx`:
- Line 117: The computed timeRangeLength (const timeRangeLength =
DateTime.fromISO(time.endDate).diff(DateTime.fromISO(time.startDate),
"days").days) omits the +1 used by the store's setTime for range mode; update
this calculation to match the store by adding 1 when the range mode is active
(e.g., add (time.mode === 'range' ? 1 : 0) to the diff) so BucketSelection's
bucket options align with setTime's logic; look for the timeRangeLength
declaration in BucketSelection.tsx and reference the store's setTime behavior to
ensure parity.

---

Outside diff comments:
In `@client/src/components/BucketSelection.tsx`:
- Line 6: Replace useExtracted with useTranslations in the BucketSelection
component: update the import from "next-intl" to import { useTranslations } and
replace any call sites of useExtracted() with useTranslations(<namespaceOrKey>)
(e.g., const t = useTranslations("BucketSelection") or appropriate namespace),
then change inline message references to use key-based lookups (t("yourKey"))
instead of inline extraction. Ensure the component's message keys are added to
the locale JSON under the chosen namespace and remove any extraction-specific
usages that only apply to useExtracted.

---

Nitpick comments:
In `@client/messages/check_translations.py`:
- Around line 12-22: The script currently only prints findings (variables empty,
stale, missing, english for each fname) and never fails CI; modify the validator
so that after printing the report for a file (after the print() block that
outputs fname and the lists) it checks if any of empty, stale, missing, or
english are non-empty and, if so, calls sys.exit(1) (or raises SystemExit(1)) to
return a failing exit code; add an import sys at the top if not present and
ensure the check runs for the overall run (e.g., track a flag or perform the
exit after each file) so the process exits non-zero when issues are found.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2d237e7 and c9cf117.

📒 Files selected for processing (18)
  • .github/workflows/translate-docs.yml
  • .github/workflows/translate.yml
  • client/messages/check_translations.py
  • client/messages/cs.json
  • client/messages/de.json
  • client/messages/en.json
  • client/messages/es.json
  • client/messages/fr.json
  • client/messages/it.json
  • client/messages/ja.json
  • client/messages/ko.json
  • client/messages/pl.json
  • client/messages/pt.json
  • client/messages/update_translations.py
  • client/messages/zh.json
  • client/scripts/extract-messages.mjs
  • client/src/components/BucketSelection.tsx
  • docs/scripts/extract-messages.mjs

Comment thread client/messages/check_translations.py Outdated
Comment thread client/messages/cs.json Outdated
Comment thread client/messages/ko.json Outdated
Comment thread client/messages/update_translations.py Outdated
Comment thread client/messages/update_translations.py Outdated
Comment thread client/src/components/BucketSelection.tsx Outdated
@lukyrys lukyrys changed the title Add Czech language to auto-translation pipeline Add Czech locale to translation pipeline, fix time units and bucket selection Feb 26, 2026
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: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
client/messages/cs.json (1)

876-900: ⚠️ Potential issue | 🟡 Minor

Same formality inconsistency continues in onboarding/trial messaging.

Lines 881, 883-884, 899-900 also use formal "vy" forms ("Začněte", "svou") instead of the informal "ty" forms used throughout the file.

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

In `@client/messages/cs.json` around lines 876 - 900, Change the
formal-second-person phrasing to informal (ty) for the onboarding/trial
messages: update the values for keys RpEtgF, FT1lfL and vYmJVk (replace
"Začněte" with "Začni" and adjust nearby wording to informal tone) and verify
aO7kNa uses the informal verb form as well; keep keys the same but edit their
string values so all four entries match the informal "ty" style used elsewhere.
🧹 Nitpick comments (2)
client/messages/update_translations.py (1)

85-91: Reordering currently preserves keys outside en.json, which can retain locale drift.

Lines 89-91 append non-English extra keys back into output. If the intent is strict locale parity, consider warning or failing on extras (or gating this behavior behind a --strict mode).
Based on learnings: Store i18n message files in messages/{locale}.json with consistent key structure across all 10 locales.

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

In `@client/messages/update_translations.py` around lines 85 - 91, The current
reordering loop (using en_key_order, ordered, data) re-appends keys not present
in en.json which preserves locale drift; change this to detect extras via extras
= set(data) - set(en_key_order) and then, instead of appending them back, either
(a) if a new CLI flag/argument like --strict is set (or a strict boolean in the
function), raise a clear error (ValueError/SystemExit) listing extras, or (b)
when not strict, emit a warning via the existing logger and skip those extra
keys so the output strictly follows en_key_order; remove the second for-loop
that appends non-English extras and ensure ordered only contains keys in
en_key_order (use en_key_order iteration to populate ordered from data).
client/messages/check_translations.py (1)

14-16: Consider adding error handling for missing or malformed files.

If a translation file is missing or contains invalid JSON, the script will crash with an unhelpful traceback. Wrapping the file load in a try-except would provide clearer diagnostics.

💡 Proposed improvement
 for fname in files:
-    with open(BASE_DIR / fname, encoding='utf-8') as f:
-        trans = json.load(f)
+    fpath = BASE_DIR / fname
+    try:
+        with open(fpath, encoding='utf-8') as f:
+            trans = json.load(f)
+    except FileNotFoundError:
+        print(f'{fname}: FILE NOT FOUND')
+        print()
+        has_issues = True
+        continue
+    except json.JSONDecodeError as e:
+        print(f'{fname}: INVALID JSON - {e}')
+        print()
+        has_issues = True
+        continue
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@client/messages/check_translations.py` around lines 14 - 16, The loop that
opens and json.load()s translation files (iterating over files, using BASE_DIR
and variable trans) lacks error handling; wrap the open(BASE_DIR / fname,
encoding='utf-8') and json.load(f) calls in a try-except that catches
FileNotFoundError and json.JSONDecodeError (and optionally OSError), log or
print a clear diagnostic including fname and the exception, and either continue
to the next file or collect errors to fail later so the script doesn't crash
with an unhelpful traceback.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@client/messages/cs.json`:
- Around line 842-858: Several new Czech translations use the formal "vy"/"vaší"
form creating inconsistency with the repo's informal "ty" tone; update the keys
uWRAQk ("Vyberte svůj plán"), Yyi9rs ("Nastavte svůj pracovní prostor"), 17v9l0
("Z vaší karty nebude strženo nic…") and any other new strings in this diff to
the informal equivalents (e.g., "Vyber svůj plán", "Nastav svůj pracovní
prostor", "Z tvé karty nebude strženo nic…") so they match existing informal
translations elsewhere (search for other keys like "Vlož tento kód" to confirm
tone).

In `@client/messages/update_translations.py`:
- Around line 81-84: The loop that applies updates (iterating over
updates.items() and assigning into data[key]) currently skips missing keys
silently while later printing "Updated {fname}"; modify the update logic in the
function handling translation file writes so you detect and record missing keys
per locale (e.g., collect missing_keys for each fname/locale when key not in
data), log or print which keys were skipped for each file (use fname and the
updates variable to reference context), avoid marking the file as fully updated
when missing_keys is non-empty, and after processing all locales return a
non-zero exit code (or raise an error) if any missing keys were skipped so the
caller can detect partial updates.

In `@client/src/components/BucketSelection.tsx`:
- Around line 141-145: The Select misses a matching "day" item when
timeRangeLength === 1 because the JSX only renders <SelectItem value="day"> when
timeRangeLength > 1 while setTime/setBucketToUse picks "day" for ranges up to
31; update the render condition so the "day" option appears for a 1-day range
(e.g., change the check from timeRangeLength > 1 to timeRangeLength >= 1 or
timeRangeLength > 0) so the Select's value ({bucket}) always has a corresponding
<SelectItem>, referencing timeRangeLength, <SelectItem value="day">,
setTime/bucketToUse and bucket/Select.
- Around line 15-50: The UI currently decides which bucket options to render
using time.pastMinutesStart alone, but the store chooses buckets based on the
time range (timeDiff = pastMinutesStart - pastMinutesEnd) so the UI can hide the
active "hour" bucket; update the BucketSelection logic to compute timeDiff =
time.pastMinutesStart - (time.pastMinutesEnd ?? 0) and use timeDiff for the
visibility thresholds (use the same thresholds the store uses: treat ranges >120
minutes as eligible for "hour", and keep your existing >=360 and >=1440 checks
for broader options) so the rendered SelectItem options (values
"minute","five_minutes","fifteen_minutes","hour") match the store's bucket
selection.

---

Outside diff comments:
In `@client/messages/cs.json`:
- Around line 876-900: Change the formal-second-person phrasing to informal (ty)
for the onboarding/trial messages: update the values for keys RpEtgF, FT1lfL and
vYmJVk (replace "Začněte" with "Začni" and adjust nearby wording to informal
tone) and verify aO7kNa uses the informal verb form as well; keep keys the same
but edit their string values so all four entries match the informal "ty" style
used elsewhere.

---

Nitpick comments:
In `@client/messages/check_translations.py`:
- Around line 14-16: The loop that opens and json.load()s translation files
(iterating over files, using BASE_DIR and variable trans) lacks error handling;
wrap the open(BASE_DIR / fname, encoding='utf-8') and json.load(f) calls in a
try-except that catches FileNotFoundError and json.JSONDecodeError (and
optionally OSError), log or print a clear diagnostic including fname and the
exception, and either continue to the next file or collect errors to fail later
so the script doesn't crash with an unhelpful traceback.

In `@client/messages/update_translations.py`:
- Around line 85-91: The current reordering loop (using en_key_order, ordered,
data) re-appends keys not present in en.json which preserves locale drift;
change this to detect extras via extras = set(data) - set(en_key_order) and
then, instead of appending them back, either (a) if a new CLI flag/argument like
--strict is set (or a strict boolean in the function), raise a clear error
(ValueError/SystemExit) listing extras, or (b) when not strict, emit a warning
via the existing logger and skip those extra keys so the output strictly follows
en_key_order; remove the second for-loop that appends non-English extras and
ensure ordered only contains keys in en_key_order (use en_key_order iteration to
populate ordered from data).

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c9cf117 and cfffe1b.

📒 Files selected for processing (5)
  • client/messages/check_translations.py
  • client/messages/cs.json
  • client/messages/ko.json
  • client/messages/update_translations.py
  • client/src/components/BucketSelection.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • client/messages/ko.json

Comment thread client/messages/cs.json Outdated
Comment thread client/messages/update_translations.py Outdated
Comment thread client/src/components/BucketSelection.tsx
Comment thread client/src/components/BucketSelection.tsx Outdated
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: 2

🧹 Nitpick comments (1)
client/src/components/BucketSelection.tsx (1)

3-8: Import ordering does not follow guidelines.

Per coding guidelines, imports should be organized with external packages first, then internal imports, sorted alphabetically within groups. Current order mixes external and internal imports.

♻️ Suggested import ordering
 "use client";
 
-import { useStore } from "@/lib/store";
-import { SelectItem, Select, SelectContent, SelectTrigger, SelectValue } from "@/components/ui/select";
-import { DateTime } from "luxon";
-import { useExtracted } from "next-intl";
-import { Time } from "./DateSelector/types";
-import { TimerReset } from "lucide-react";
+import { TimerReset } from "lucide-react";
+import { DateTime } from "luxon";
+import { useTranslations } from "next-intl";
+
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { useStore } from "@/lib/store";
+import { Time } from "./DateSelector/types";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@client/src/components/BucketSelection.tsx` around lines 3 - 8, Reorder the
imports so external packages come first (alphabetically) and then internal
imports (alphabetically) — locate the import lines referencing TimerReset,
DateTime, and useExtracted (from lucide-react, luxon, next-intl) and move them
above the internal imports; then sort the internal imports (the lines importing
Select/SelectItem/SelectContent/SelectTrigger/SelectValue, useStore, and Time
from "./DateSelector/types") alphabetically within that group so the file
imports appear in the correct grouped order.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@client/messages/cs.json`:
- Line 290: Replace the formal imperative and formal possessive in message
"mV7XLc" with the informal form to match the rest of the file: change the value
currently starting with "Vytvořte" and "vašem" to the informal imperative and
possessive, e.g. use "Vytvoř svůj první trychtýř pro sledování konverzí v
uživatelské cestě na tvém webu." Update the string identified by "mV7XLc".
- Line 899: The translation for key "GnHuiT" is using the formal imperative
"Začněte zdarma" which is inconsistent with nearby informal CTAs (e.g.,
"Začni"); update the value for "GnHuiT" to the informal form "Začni zdarma" and
scan the cs.json for any other occurrences of "Začněte" to replace them with the
informal variant so all CTAs in this user flow use the same tone.

---

Nitpick comments:
In `@client/src/components/BucketSelection.tsx`:
- Around line 3-8: Reorder the imports so external packages come first
(alphabetically) and then internal imports (alphabetically) — locate the import
lines referencing TimerReset, DateTime, and useExtracted (from lucide-react,
luxon, next-intl) and move them above the internal imports; then sort the
internal imports (the lines importing
Select/SelectItem/SelectContent/SelectTrigger/SelectValue, useStore, and Time
from "./DateSelector/types") alphabetically within that group so the file
imports appear in the correct grouped order.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cfffe1b and 16ec867.

📒 Files selected for processing (2)
  • client/messages/cs.json
  • client/src/components/BucketSelection.tsx

Comment thread client/messages/cs.json Outdated
Comment thread client/messages/cs.json Outdated
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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/src/i18n/routing.ts`:
- Line 4: Update the languages array in the i18n configuration so it matches
routing: open the languages export/constant in docs/src/lib/i18n.ts (the
languages: [...] declaration) and add the missing 'cs' entry to the array so it
becomes ['en','de','fr','zh','es','pl','it','ko','pt','ja','cs'], ensuring the
array ordering/format matches the existing style and exports.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c82545c and 46fe777.

📒 Files selected for processing (3)
  • docs/messages/cs.json
  • docs/src/components/LanguageSwitcher.tsx
  • docs/src/i18n/routing.ts
✅ Files skipped from review due to trivial changes (1)
  • docs/messages/cs.json

Comment thread docs/src/i18n/routing.ts Outdated
@lukyrys
Copy link
Copy Markdown
Contributor Author

lukyrys commented Apr 26, 2026

@goldflag Hello, i updated this PR for actual state od main

@lukyrys lukyrys force-pushed the czech-translations branch 2 times, most recently from 25c6bdd to 28705b1 Compare April 27, 2026 12:56
lukyrys referenced this pull request Apr 27, 2026
…es, ensuring consistency and accuracy across English, German, Czech, Spanish, French, Italian, and Japanese. This update enhances the user experience by providing localized content for various UI elements and messages.
@lukyrys lukyrys changed the title Add Czech locale to translation pipeline, fix time units and bucket selection Add Czech locale to client and docs Apr 27, 2026
lukyrys added 8 commits May 6, 2026 09:36
The en.json reordering introduced by extract-messages was non-semantic
(same 1219 keys/values, only differed in key order: upstream is
alphabetically sorted, extraction output is in source-walk order).
Reset to upstream so the diff stays focused on Czech additions only.
Upstream handles translation checks inline in
.github/workflows/translate.yml (workflow loops over languages, counts
keys, checks for empty values). The Python scripts duplicated that and
contained a phantom-key populator that referenced keys not in en.json.

Removed:
- client/messages/check_translations.py
- client/messages/update_translations.py
After rebasing on upstream/master the auto-merge in cs.json had
reordered keys into a non-upstream sequence (390k+ lines of fake diff).
Resorted cs.json to match upstream/master key order and reset en.json
back to upstream (it had drifted into source-walk order again).
@lukyrys lukyrys force-pushed the czech-translations branch from c8fa426 to f33183f Compare May 6, 2026 07:38
lukyrys added 2 commits May 6, 2026 09:45
…ions

Replaces literal Czech translations with English terms commonly used in
Czech tech UIs:
- 'trychtýř' -> 'funnel' (29 keys, makes 'Vytvoř svůj první funnel'
  consistent with 'Funnely' nav item)
- 'relace' -> 'session' / 'sessions' (Session Replay, Session ID)
- 'zobrazení stránek' -> 'pageviews'
- 'přehrávání' -> 'replay' (in Session Replay context)
- 'přehled' -> 'dashboard' (in 'analytics dashboard' context)
- 'časové razítko' -> 'timestamp'
- 'postranní panel' -> 'sidebar'
- 'pracovní prostor' -> 'workspace'

Czech analytics terminology kept for domain-specific concepts:
- 'Cíle' (Goals)
- 'událost' (Event) - already widely used in CZ analytics
- 'organizace' (Organization)
Places 'cs' between 'pl' and 'it' in alphabetical-ish ordering instead
of right after 'en'. Affects:
- client/scripts/extract-messages.mjs
- docs/scripts/extract-messages.mjs
- docs/src/i18n/routing.ts
- docs/src/lib/i18n.ts
- .github/workflows/translate.yml
- .github/workflows/translate-docs.yml
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