Skip to content

Comments

feat: update translations via @LingoDotDev#22894

Merged
keithwillcode merged 1 commit intomainfrom
lingo.dev/main
Aug 27, 2025
Merged

feat: update translations via @LingoDotDev#22894
keithwillcode merged 1 commit intomainfrom
lingo.dev/main

Conversation

@calcom-bot
Copy link
Collaborator

Hey team,

Lingo.dev here with fresh translations!

In this update

  • Added missing translations
  • Performed brand voice, context and glossary checks
  • Enhanced translations using Lingo.dev Localization Engine

Next Steps

  • Review the changes
  • Merge when ready

@vercel
Copy link

vercel bot commented Aug 5, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Preview Comments Updated (UTC)
cal Ignored Ignored Aug 26, 2025 8:31pm
cal-eu Ignored Ignored Aug 26, 2025 8:31pm

@CLAassistant
Copy link

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.


Lingo.dev seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 5, 2025

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • i18n.lock is excluded by !**/*.lock

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

Renames round_robin_hosts_unavailable_for_bookinground_robin_host_unavailable_for_booking and expands the public locales across many languages. Adds group/round‑robin strings (round_robin_groups_helper, rr_load_balancing_disabled_with_groups, add_group, failed_bookings), OAuth client UI keys and admin flags, form/routing options (use_my_own_form, use_our_headless_routing_api), extensive webhook payload/management keys (webhook_*), variable placeholders (location, timezone, attendee start/end times, rating/no-show URLs), onboarding copy updates (connect_your_video, finish_and_start, connect_calendar_first, complete_profile), and a broad PBAC surface (pbac_resource_*, pbac_desc_*) with several descriptors reworded to organization scope.

Possibly related PRs

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch lingo.dev/main

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@graphite-app graphite-app bot requested review from a team August 5, 2025 00:34
@keithwillcode keithwillcode added core area: core, team members only foundation labels Aug 5, 2025
@dosubot dosubot bot added the i18n area: i18n, translations label Aug 5, 2025
@graphite-app
Copy link

graphite-app bot commented Aug 5, 2025

Graphite Automations

"Add consumer team as reviewer" took an action on this PR • (08/05/25)

1 reviewer was added to this PR based on Keith Williams's automation.

"Add foundation team as reviewer" took an action on this PR • (08/05/25)

1 reviewer was added to this PR based on Keith Williams's automation.

Copy link
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

♻️ Duplicate comments (1)
apps/web/public/static/locales/zh-TW/common.json (1)

1843-1844: 延伸字串同樣需保持一致用詞

這兩條權限說明仍使用「用戶端」。為保持一致,請同步改為「客戶端」。

🧹 Nitpick comments (34)
apps/web/public/static/locales/vi/common.json (1)

1843-1845: Minor typography: missing period at sentence end

Lines 1843–1845 are full sentences but lack a terminal full-stop “.”.
Adding it keeps style identical to neighbouring admin-only notices (see Line 183-184 etc.).

-"Chỉ quản trị viên hoặc chủ sở hữu của tổ chức mới có thể quản lý cài đặt đồng bộ hóa thư mục"
+"Chỉ quản trị viên hoặc chủ sở hữu của tổ chức mới có thể quản lý cài đặt đồng bộ hóa thư mục."

(Apply same to Line 1845).

apps/web/public/static/locales/ru/common.json (1)

874-878: Consider the correct case for the direct-object form of “OAuth-client”.

In Russian UI strings the object after “создать” normally takes the accusative case.
"create_oauth_client": "Создать OAuth-клиент" should likely be
"Создать OAuth-клиента" to be grammatically correct.

-"create_oauth_client": "Создать OAuth-клиент",
+"create_oauth_client": "Создать OAuth-клиента",
apps/web/public/static/locales/uk/common.json (3)

874-877: Terminology consistency check for OAuth-related strings

Looks good overall, but double-check that the existing UI consistently uses “OAuth клієнт” (singular) vs “OAuth клієнти” (plural).
In English we often mix “OAuth app / client”, so make sure the same Ukrainian term is used everywhere to avoid UI mismatches.

No action required if the rest of the locale already follows this wording.


3311-3315: PBAC resource additions: keep alphabetical grouping

The new pbac_resource_attributes + description keys are appended to the block but break the existing alphabetical order of resources/descriptions set earlier in the file (event_type, organization, …).
Consider moving the four lines into the correct sorted position to keep future diffs minimal.

No functional impact – purely maintainability.


3319-3324: Updated “manage_*” descriptions – spelling check

Minor typo: “подій” vs “подій у”. Line 3324 currently reads
"Усі дії з типами подій у командах організації"
where “подій” already conveys genitive; “у” is OK but occasionally omitted elsewhere. Ensure wording is uniform across all pbac_desc_manage_* entries (roles, teams, event types) to avoid translator noise.

If the English originals differ, ignore.

apps/web/public/static/locales/ca/common.json (1)

3311-3316: Minor typo: atributs not attributs

atributs is already spelled correctly in the value strings, but the resource key also carries that typo (pbac_resource_attributes).
If this was copied from the English locale it is fine, but double-check—renaming later is painful.

apps/web/public/static/locales/zh-TW/common.json (1)

3311-3316: 新增 PBAC 描述請檢查標點一致性

  1. Line 3313 與 3314 句尾缺少句號,而同區段其他描述多使用句號收尾。
  2. Line 3315 pbac_desc_manage_roles 應與前面敘述格式一致,可改為「管理組織(團隊)中角色的所有操作。」

屬於細節但會影響文件閱讀體驗。

apps/web/public/static/locales/pl/common.json (1)

1843-1844: Keep tone consistent in admin-only messages

Strings only_admin_can_manage_directory_sync / only_admin_can_manage_oauth_clients start with “Tylko administrator lub właściciel…”.
Every other “admin-only” string in this file starts with “Tylko administrator …”.
For consistency either drop “lub właściciel” everywhere or keep it everywhere. Pick one and run i18n lint afterwards.

apps/web/public/static/locales/hu/common.json (2)

1843-1844: Consistency with existing “only_admin_can_…” strings

The newly added keys follow the existing pattern but use singular “admin” while some previous entries use plural (“admins”).
Consider renaming to only_admins_can_manage_* for consistency with siblings (only_admins_can_manage_sso_org, etc.).


3311-3316: Keep PBAC help-texts alphabetically grouped

New PBAC resource/description pairs for “attributes” were appended at the bottom of the block.
For easier diffing & merge-conflict avoidance place them alphabetically with the other pbac_* entries.
This repo has been bitten by duplicated keys in the past.

apps/web/public/static/locales/pt/common.json (2)

874-877: Consider adding the definite article and keeping the voice consistent

Most description strings in this file start with an imperative verb followed by the article “os” (e.g. “Gerencie os webhooks…”, “Configure as definições…”).
For consistency, prefer:

- "oauth_clients_description": "Gerencie clientes OAuth para sua organização",
+ "oauth_clients_description": "Gerencie os clientes OAuth da sua organização",

Minor, but it keeps wording uniform across the glossary.


1843-1844: Capitalisation & voice inconsistent with neighbouring keys

Nearly every permission-warning string starts with a capital letter and the infinitive “Gerenciar/Administrar…”.
These two new entries start with a lowercase “gerenciar”.

- "only_admin_can_manage_directory_sync": "Apenas o administrador ou proprietário da organização pode gerenciar as configurações de sincronização de diretório",
- "only_admin_can_manage_oauth_clients": "Apenas o administrador ou proprietário da organização pode gerenciar clientes OAuth",
+ "only_admin_can_manage_directory_sync": "Apenas o administrador ou o proprietário da organização pode gerenciar as configurações de sincronização de diretório",
+ "only_admin_can_manage_oauth_clients": "Apenas o administrador ou o proprietário da organização pode gerenciar os clientes OAuth",

This keeps capitalisation and the article “o” in line with the existing sentence style.

apps/web/public/static/locales/cs/common.json (1)

874-878: Ensure punctuation style consistency

Most Czech strings in this file end without a trailing period, but several neighbouring entries (e.g. "create_new_team_description") do use one.
For consistency across the locale consider either removing the full stop in

"create_oauth_client_description": "Vytvořte nového OAuth klienta pro integraci s třetími stranami"

or systematically adding a period to the other short-description keys that currently lack it.
(This is purely cosmetic; nothing is functionally wrong.)

apps/web/public/static/locales/de/common.json (1)

3311-3316: PBAC attribute entries added without placeholder/grammar issues

– Keys are unique.
– German wording (“Organisationsattribute”) matches the resource context.
– No placeholder tokens to validate.

Consider keeping these PBAC description blocks alphabetically grouped like the existing ones for easier maintenance, but that’s optional.

apps/web/public/static/locales/sk-SK/common.json (2)

874-877: Check consistency of term “OAuth klient” (singular) vs “OAuth klienti” (plural).

In the Slovak strings you mix:

  • "oauth_clients"OAuth klienti (plural, correct)
  • "create_oauth_client"Vytvoriť OAuth klienta (singular, genitive) – fine
  • "create_oauth_client_description"… klienta (singular) – also fine

However, "oauth_clients_description" reads Spravujte OAuth klientov (genitive plural). The heading is plural nominative (klienti), while the description uses genitive plural (klientov). That’s grammatically correct, but double-check the UI: if the heading appears right above the description it may read odd ( OAuth klienti – Spravujte OAuth klientov ). Consider using nominative plural in the description (Spravujte OAuth klienti vo vašej organizácii) or rewriting the heading ( Správa OAuth klientov ) so both lines do not repeat the noun back-to-back.


1843-1844: Minor wording alignment for admin-only notices.

Both keys are admin-gate messages; first ends with nastavenia synchronizácie adresára, second with OAuth klientov. For parallelism consider:

"Iba administrátor alebo vlastník organizácie môže spravovať synchronizáciu adresára"
"Iba administrátor alebo vlastník organizácie môže spravovať OAuth klientov"

This removes the extra word nastavenia so the two strings scan identically.

apps/web/public/static/locales/pt-BR/common.json (1)

1843-1844: Use one term for “owner” across the file

Earlier keys (e.g. only_admin_can_manage_sso_org, Line 1841) use “dono da organização”, whereas the two new strings adopt “proprietário da organização”. Mixing “dono” and “proprietário” might confuse translators and users.

- "Apenas o administrador ou proprietário da organização pode gerenciar ..."
+ "Apenas o administrador ou dono da organização pode gerenciar ..."
apps/web/public/static/locales/bg/common.json (1)

874-876: Consider keeping new OAuth-related keys grouped with existing OAuth strings for maintainability

These keys are inserted ~200 lines above the other OAuth strings that start at Line 878.
Moving them next to the existing block (or vice-versa) keeps the file logically grouped and eases future diff reviews.

apps/web/public/static/locales/sr/common.json (2)

874-878: Validate new OAuth-related keys & keep alphabetical ordering

The newly added keys (oauth_clientscreate_oauth_client_description) break the existing alphabetic ordering of the JSON (they appear after nameless_team).
While order does not affect runtime, keeping the file sorted greatly reduces merge-conflicts in the enormous common.json.

-  "nameless_team": "Tim bez imena",
-  "oauth_clients": "OAuth klijenti",
-  ...
+  "nameless_team": "Tim bez imena",
+  // --- keep alphabetic ordering: place below “offer_seats” block ---

Consider moving the block accordingly before merging.
No functional issues with the Serbian strings themselves.


1843-1845: Plural consistency for admin-only strings

only_admin_can_manage_directory_sync and only_admin_can_manage_oauth_clients start with “Samo administrator ili vlasnik … može” (singular) but end with “mogu” (plural).
Recommend aligning the verb with the subject for readability:

- "only_admin_can_manage_directory_sync": "Samo administrator ili vlasnik organizacije može upravljati podešavanjima sinhronizacije direktorijuma",
+ "only_admin_can_manage_directory_sync": "Samo administrator ili vlasnik organizacije može da upravlja podešavanjima sinhronizacije direktorijuma",

- "only_admin_can_manage_oauth_clients": "Samo administrator ili vlasnik organizacije može upravljati OAuth klijentima"
+ "only_admin_can_manage_oauth_clients": "Samo administrator ili vlasnik organizacije može da upravlja OAuth klijentima"
apps/web/public/static/locales/ar/common.json (1)

3311-3316: PBAC attribute keys added – just verify uniqueness
Keys for the new PBAC resource (pbac_resource_attributes) and its CRUD descriptions are correct. Run a quick duplicate-key check on the whole JSON file to ensure these identifiers don’t collide with earlier ones; large locale files sometimes accumulate silent duplicates.

apps/web/public/static/locales/no/common.json (2)

874-877: Unify the Norwegian term for OAuth client

Earlier in the same file (line 240 → webhook_update_form_description) the term is written as “OAuthClient” (camel-cased, no hyphen), whereas the four new keys use “OAuth-klient”.
For consistency and to avoid confusion in the UI, stick to one variant throughout the locale file (ideally the hyphenated “OAuth-klient”, which reads better in Norwegian).


3311-3315: Minor formatting – last item can drop the trailing comma

Line 3315 ends with a comma while the following line already starts a new top-level key. JSON allows the extra comma in many runtimes, but pruning it prevents accidental linting errors in stricter parsers.

-  "pbac_desc_create_organization_attributes": "Opprett organisasjonsegenskaper",
+  "pbac_desc_create_organization_attributes": "Opprett organisasjonsegenskaper"
apps/web/public/static/locales/ko/common.json (1)

1842-1845: Minor wording inconsistency

Lines 1842-1845 mix “관리자 또는 소유자” with “관리자만”.
For perfect consistency with the neighbouring permission strings (e.g. 1838-1841) consider aligning the wording, e.g.

- "조직의 관리자 또는 소유자만 디렉토리 동기화 설정을 관리할 수 있습니다"
+ "조직의 관리자(소유자 포함)만 디렉토리 동기화 설정을 관리할 수 있습니다"
apps/web/public/static/locales/he/common.json (1)

1843-1845: Missing plural-gender neutrality

The two strings use “מנהל או בעלים” in singular masculine form.
Other Hebrew translations in the file avoid gendered phrasing by using neutral participles (e.g. “מנהל/ת מערכת”).
Consider aligning:

- "רק מנהל או בעלים של הארגון..."
+ "רק מנהל/ת מערכת או בעל/ת הארגון..."
apps/web/public/static/locales/es-419/common.json (1)

1843-1844: Minor consistency issue in admin-only strings
Line 1843 already says “Solo el administrador o propietario…”. At 1844 you add essentially the same pattern. Consider moving both messages into a single placeholder‐based template to avoid copy-paste drift when wording changes in the future.

apps/web/public/static/locales/es/common.json (1)

874-878: Polish OAuth-related strings for consistency and grammar

  1. Use an article before “cliente” to match Spanish idiom (“Crear un cliente OAuth”).
  2. Capitalise the first word in the description for consistency with neighbouring keys (“Gestiona los…” → “Gestiona los…”)
  3. Consider adding “los” to keep parallelism with other descriptions (“Gestiona los clientes OAuth…”).
-"oauth_clients": "Clientes OAuth",
-"oauth_clients_description": "Gestiona los clientes OAuth para tu organización",
-"create_oauth_client": "Crear cliente OAuth",
-"create_oauth_client_description": "Crea un nuevo cliente OAuth para integraciones de terceros",
+"oauth_clients": "Clientes OAuth",
+"oauth_clients_description": "Gestiona los clientes OAuth de tu organización",
+"create_oauth_client": "Crear un cliente OAuth",
+"create_oauth_client_description": "Crea un nuevo cliente OAuth para integraciones de terceros",
apps/web/public/static/locales/km/common.json (2)

874-877: Confirm wording for “OAuth client” — current Khmer phrasing sounds like a “machine”
The term ​«ម៉ាស៊ីនភ្ញៀវ» literally means “client machine”. In most Khmer UIs we usually keep OAuth client untranslated or borrow the English word “client” (e.g. «OAuth Client» or «Client OAuth») instead of “ម៉ាស៊ីនភ្ញៀវ”.
Please double-check with your localisation guide to make sure the term is recognisable to end-users.


1843-1844: Minor consistency nit – reuse existing wording for “organization”
In earlier strings the project consistently uses «អង្គការ» for “organization”. Here the translation for
only_admin_can_manage_directory_sync and only_admin_can_manage_oauth_clients introduces the variant «អង្គភាព».
Consider standardising on one term (preferably the one already used elsewhere) to avoid confusion.

apps/web/public/static/locales/it/common.json (2)

874-877: Add the missing indefinite article in the new “OAuth client” strings
In Italian the action labels generally include an article (“Crea un …”) to read naturally, e.g. earlier keys such as create_webhook use “Crea un Webhook”.
Consider:

- "create_oauth_client": "Crea client OAuth",
- "create_oauth_client_description": "Crea un nuovo client OAuth per integrazioni di terze parti"
+ "create_oauth_client": "Crea un client OAuth",
+ "create_oauth_client_description": "Crea un nuovo client OAuth per integrazioni di terze parti"

3312-3316: Minor consistency touch-up: keep the noun order aligned with similar PBAC keys
Most existing PBAC descriptions start with the verb and keep the resource near the end, e.g. “Crea attributi dell’organizzazione”. For perfect alignment you may want to mirror the wording used for other resources (eventi, ruoli, …). Current text is already correct, so this is only stylistic.

apps/web/public/static/locales/fr/common.json (2)

1842-1843: Minor wording nit-pick

"Seul l'administrateur ou le propriétaire de l'organisation peut gérer …" reads well, but every other permission string in this file begins with “Seul l’administrateur* de l’organisation** ou son propriétaire …”* (note the extra “de l’organisation” after administrateur).

For perfect consistency you could tweak:

-"Seul l'administrateur ou le propriétaire de l'organisation peut gérer les paramètres de synchronisation d'annuaire",
-"Seul l'administrateur ou le propriétaire de l'organisation peut gérer les clients OAuth",
+"Seul l'administrateur de l'organisation ou son propriétaire peut gérer les paramètres de synchronisation d'annuaire",
+"Seul l'administrateur de l'organisation ou son propriétaire peut gérer les clients OAuth",

3312-3316: Uniform wording for attribute-related PBAC descriptions

Three existing PBAC descriptions use “de l'organisation” (view / update / delete) while the new one for create reads “d'organisation”.
Recommend unifying the article for searchability and visual consistency:

-"pbac_desc_create_organization_attributes": "Créer des attributs d'organisation",
+"pbac_desc_create_organization_attributes": "Créer des attributs de l'organisation",
apps/web/public/static/locales/eu/common.json (1)

874-878: Consistent naming, but singular/plural wording could be tighter

oauth_clients → “OAuth bezeroak” (plural) and create_oauth_client → “OAuth bezeroa” (singular) are correct, yet oauth_clients_description still uses the plural (“bezeroak”).
To keep the glossaries aligned with most other locales you may want to switch to the singular in the description, e.g.

-"Kudeatu zure erakundearen OAuth bezeroak"
+"Zure erakundearen OAuth bezeroa kudeatu"
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0829929 and f8aebc9.

⛔ Files ignored due to path filters (1)
  • i18n.lock is excluded by !**/*.lock
📒 Files selected for processing (36)
  • apps/web/public/static/locales/ar/common.json (6 hunks)
  • apps/web/public/static/locales/az/common.json (6 hunks)
  • apps/web/public/static/locales/bg/common.json (6 hunks)
  • apps/web/public/static/locales/bn/common.json (6 hunks)
  • apps/web/public/static/locales/ca/common.json (6 hunks)
  • apps/web/public/static/locales/cs/common.json (6 hunks)
  • apps/web/public/static/locales/da/common.json (6 hunks)
  • apps/web/public/static/locales/de/common.json (6 hunks)
  • apps/web/public/static/locales/el/common.json (6 hunks)
  • apps/web/public/static/locales/es-419/common.json (6 hunks)
  • apps/web/public/static/locales/es/common.json (6 hunks)
  • apps/web/public/static/locales/et/common.json (6 hunks)
  • apps/web/public/static/locales/eu/common.json (6 hunks)
  • apps/web/public/static/locales/fi/common.json (6 hunks)
  • apps/web/public/static/locales/fr/common.json (6 hunks)
  • apps/web/public/static/locales/he/common.json (6 hunks)
  • apps/web/public/static/locales/hu/common.json (6 hunks)
  • apps/web/public/static/locales/it/common.json (6 hunks)
  • apps/web/public/static/locales/ja/common.json (6 hunks)
  • apps/web/public/static/locales/km/common.json (6 hunks)
  • apps/web/public/static/locales/ko/common.json (6 hunks)
  • apps/web/public/static/locales/nl/common.json (6 hunks)
  • apps/web/public/static/locales/no/common.json (6 hunks)
  • apps/web/public/static/locales/pl/common.json (6 hunks)
  • apps/web/public/static/locales/pt-BR/common.json (6 hunks)
  • apps/web/public/static/locales/pt/common.json (6 hunks)
  • apps/web/public/static/locales/ro/common.json (6 hunks)
  • apps/web/public/static/locales/ru/common.json (6 hunks)
  • apps/web/public/static/locales/sk-SK/common.json (6 hunks)
  • apps/web/public/static/locales/sr/common.json (6 hunks)
  • apps/web/public/static/locales/sv/common.json (6 hunks)
  • apps/web/public/static/locales/tr/common.json (6 hunks)
  • apps/web/public/static/locales/uk/common.json (6 hunks)
  • apps/web/public/static/locales/vi/common.json (6 hunks)
  • apps/web/public/static/locales/zh-CN/common.json (6 hunks)
  • apps/web/public/static/locales/zh-TW/common.json (6 hunks)
🧰 Additional context used
🧠 Learnings (3)
📓 Common learnings
Learnt from: bandhan-majumder
PR: calcom/cal.com#22359
File: packages/lib/server/locales/en/common.json:1336-1339
Timestamp: 2025-07-14T16:31:45.233Z
Learning: When making localization changes for new features, it's often safer to add new strings rather than modify existing ones to avoid breaking existing functionality that depends on the original strings. This approach allows for feature-specific customization while maintaining backward compatibility.
📚 Learning: when making localization changes for new features, it's often safer to add new strings rather than m...
Learnt from: bandhan-majumder
PR: calcom/cal.com#22359
File: packages/lib/server/locales/en/common.json:1336-1339
Timestamp: 2025-07-14T16:31:45.233Z
Learning: When making localization changes for new features, it's often safer to add new strings rather than modify existing ones to avoid breaking existing functionality that depends on the original strings. This approach allows for feature-specific customization while maintaining backward compatibility.

Applied to files:

  • apps/web/public/static/locales/zh-CN/common.json
  • apps/web/public/static/locales/pl/common.json
  • apps/web/public/static/locales/et/common.json
  • apps/web/public/static/locales/ca/common.json
  • apps/web/public/static/locales/pt-BR/common.json
  • apps/web/public/static/locales/uk/common.json
  • apps/web/public/static/locales/sv/common.json
  • apps/web/public/static/locales/da/common.json
  • apps/web/public/static/locales/bn/common.json
  • apps/web/public/static/locales/de/common.json
  • apps/web/public/static/locales/az/common.json
  • apps/web/public/static/locales/km/common.json
  • apps/web/public/static/locales/zh-TW/common.json
  • apps/web/public/static/locales/hu/common.json
  • apps/web/public/static/locales/ro/common.json
  • apps/web/public/static/locales/cs/common.json
  • apps/web/public/static/locales/ru/common.json
  • apps/web/public/static/locales/sr/common.json
  • apps/web/public/static/locales/el/common.json
  • apps/web/public/static/locales/bg/common.json
  • apps/web/public/static/locales/vi/common.json
  • apps/web/public/static/locales/pt/common.json
  • apps/web/public/static/locales/ar/common.json
  • apps/web/public/static/locales/tr/common.json
  • apps/web/public/static/locales/sk-SK/common.json
  • apps/web/public/static/locales/eu/common.json
  • apps/web/public/static/locales/ja/common.json
  • apps/web/public/static/locales/no/common.json
📚 Learning: applies to docs/api-reference/v2/openapi.json : when docs changes are made in `/docs/api-reference/v...
Learnt from: CR
PR: calcom/cal.com#0
File: .cursor/rules/review.mdc:0-0
Timestamp: 2025-07-28T11:50:23.946Z
Learning: Applies to docs/api-reference/v2/openapi.json : When docs changes are made in `/docs/api-reference/v2/openapi.json`, ensure 'summary' fields are short, concise, do not end with a period, and are written in proper American English

Applied to files:

  • apps/web/public/static/locales/pt/common.json
  • apps/web/public/static/locales/eu/common.json
  • apps/web/public/static/locales/nl/common.json
🔇 Additional comments (77)
apps/web/public/static/locales/zh-CN/common.json (4)

873-878: OAuth client keys correctly added

New keys follow existing naming conventions, include the mandatory Chinese brand-terminology “OAuth 客户端”, and preserve punctuation/placeholder style. ✅


1842-1843: Admin-only management strings read well

Both strings are clear and align with the other “only_admin_can_…” messages already present. No issues.


3311-3316: PBAC attribute entries are syntactically sound

Keys are unique, descriptive, and comma-terminated; translations stay consistent with the earlier PBAC block.


3433-3434: Minor follow-up: check for duplicate key “stats” across locales

I don’t see “stats” defined elsewhere in this file, but please run a quick grep across all locale JSONs to be certain a second definition hasn’t slipped in (the last-one-wins rule would silently mask the earlier value).

apps/web/public/static/locales/da/common.json (4)

874-878: Translations look consistent – no issues found.

Keys for OAuth-client administration are new, unique, and follow the existing naming/translation style.


1843-1845: Key names are fine; just check for duplicate entries.

only_admin_can_manage_directory_sync / …oauth_clients are new and do not appear elsewhere in the file. Nothing to change.


3311-3315: PBAC attribute strings added correctly.

The new permission-related strings align with previous PBAC keys. No conflicts detected.


3433-3435: New “stats” / “booking_status” keys are fine.

Names are intuitive and translations match existing tone.

apps/web/public/static/locales/ro/common.json (3)

874-877: Translations look accurate; validate comma placement

Romanian strings read naturally and match the English semantics.
Just ensure the trailing comma on Line 877 is retained only when another key follows, otherwise JSON becomes invalid.


1843-1844: Consistent terminology with previous OAuth strings

The wording keeps the previously-introduced “clienți OAuth” phrasing, maintaining consistency – good job.
No issues found.


3311-3315: New PBAC attribute keys translated correctly

All four permission-description strings preserve the meaning of “attributes” and follow the existing PBAC prefix style.
Looks good.

apps/web/public/static/locales/vi/common.json (2)

874-877: Verify capital-letter consistency in new OAuth strings

The surrounding strings use “OAuth client” as “Ứng dụng OAuth” (Line 874) and “Tạo ứng dụng OAuth” (Line 876).
Elsewhere in the file (e.g. Line 240 "webhook_update_form_description"), “OAuthClient” is left untranslated. Consider keeping the term consistent across the whole locale – either always translate as “Ứng dụng OAuth” or keep the original “OAuth client”.


3311-3315: Ensure PBAC action descriptions stay imperative

The new permission descriptions (Lines 3312-3315) start with “Xem/Cập nhật/Xóa/Tạo thuộc tính …” which follows the existing imperative style (e.g. pbac_desc_view_roles).
LGTM, no further action.

apps/web/public/static/locales/ru/common.json (3)

1843-1844: Wording is clear – good addition.

The admin-only notices are concise and match existing phrasing. No issues spotted.


3311-3316: Verify uniqueness of newly added PBAC keys.

The new attribute-related PBAC keys look correct, but please ensure there are no existing entries with the same identifiers elsewhere in this file (e.g. produced by earlier merges).
Duplicate keys would silently override each other at runtime.


3405-3405: Potential duplicate key “stats”.

A generic key such as "stats" is prone to already exist in large locale files.
Run a quick check; if a prior “stats” key is found, rename one of them (e.g. stats_menu vs stats_header) to avoid overwriting.

apps/web/public/static/locales/uk/common.json (1)

1843-1844: Permission-gate strings added – verify key reuse

These two keys mirror the pattern used for other only_admin_can_ strings.
Just confirm there are no earlier keys with the exact same id but a slightly different text (e.g. leftover from previous PRs) – duplicate ids silently override values at runtime.

apps/web/public/static/locales/ca/common.json (3)

874-878: Check cross-locale consistency for newly introduced OAuth strings

The four keys for OAuth client management are present only in this Catalan file.
Please make sure identical keys (with English text) exist in your base locale (en/common.json) and in any other mandatory locales; otherwise the i18n layer will fall back to the key name at runtime.


1843-1844: Wording aligns with existing pattern – looks good

The new admin-only warning strings follow the same style used by the surrounding "only_admin_can_manage_*" messages, so no changes needed.


3405-3406: Possible duplicate key ― verify stats uniqueness

"stats": "Estadístiques" is introduced here.
Search the full file (and other locale files) for an existing stats entry; duplicate keys in a JSON object silently override earlier definitions and make maintenance harder.

apps/web/public/static/locales/az/common.json (2)

874-877: Strings look consistent – no issues found

The four newly-added OAuth keys follow the existing naming convention, punctuation and placeholder-less pattern used throughout this file. JSON syntax is also valid (commas are present).
No action required.


1842-1843: Consistent admin-scope phrasing

The two new admin-only messages mirror the wording style of the neighbouring only_admin_can_manage_* entries and end with the correct “idarə edə bilər” phrase. JSON syntax is intact.
LGTM.

apps/web/public/static/locales/pl/common.json (2)

3311-3316: Align new PBAC keys with existing naming pattern

Existing PBAC keys use resource singular (organization_attribute) not plural.
New keys introduced under pbac_resource_attributes & related descriptions are pluralised (attributes).
If the backend expects the singular resource id, rename to avoid mismatched permissions look-up.


874-878: No duplicate OAuth translation keys detected

  • Verified that oauth_clients, oauth_clients_description, create_oauth_client, and create_oauth_client_description each appear only once (lines 874–877) in apps/web/public/static/locales/pl/common.json.
apps/web/public/static/locales/el/common.json (2)

874-878: New OAuth-related keys are well-formed and consistently translated

Key names follow the existing snake-case convention and the Greek strings accurately reflect their English intent. No placeholder or punctuation issues spotted.


1843-1844: Admin-only notices read clearly and match prior pattern

The added permission messages reuse the same phrasing as similar keys (only_admin_can_*) and keep the wording concise. Nothing to change.

apps/web/public/static/locales/hu/common.json (1)

874-877: Verify new OAuth-related keys are covered by the UI and back-end look-ups

These four string IDs are brand-new.
Please double-check that:

  1. The UI components use exactly these keys (oauth_clients, oauth_clients_description, …).
  2. Server-side permission checks / PBAC rules reference the same IDs (case-sensitive).

Missing look-ups will silently fall back to English at runtime.

apps/web/public/static/locales/et/common.json (2)

874-877: Strings look good – placeholders preserved

No syntax issues and the terminology (“OAuth kliendid”, “Halda …”) is consistent with the rest of the file.


1843-1844: Consistent admin-permission phrasing

Both new keys keep the established “Ainult … saab …” formulation and correctly reference “organisatsiooni administraator või omanik”.

apps/web/public/static/locales/pt/common.json (2)

3311-3315: LGTM – new PBAC strings are accurate & follow existing pattern

The new attribute-related permission texts use the same infinitive pattern (“Visualizar”, “Atualizar”, …) used in the surrounding PBAC entries. No issues found.


3433-3434: Potential semantic clash between stats and existing analytics

"stats": "Estatísticas" duplicates the Portuguese word already used for the key analytics.
If both keys are rendered in the same UI area the labels will be indistinguishable.
Consider differentiating, e.g.:

"stats": "Métricas"

or leave as-is if the two keys never appear together.

apps/web/public/static/locales/sv/common.json (4)

874-877: New OAuth-related keys look good

– Terminology (“OAuth-klient(er)”) is consistent with previously-used wording
– Plural/singular forms match the context (“klienter” vs “Skapa … klient”)
No action required.


1843-1844: Admin-only sentences read correctly

Both strings are grammatically correct Swedish and mirror the existing “only_admin…” keys.
No further changes needed.


3311-3315: PBAC attribute permissions – translation consistent

“Egenskaper” is already the Swedish term used for attributes elsewhere in the file, so the new permission phrases stay coherent.
All verbs (“Visa”, “Uppdatera”, “Ta bort”, “Skapa”) follow the existing style.


3434-3435: New generic UI strings OK

“Statistik” and “Bokningsstatus” are accurate and not duplicated elsewhere in the file.
JSON syntax around the additions is valid.

apps/web/public/static/locales/cs/common.json (2)

1843-1844: Wording aligns with existing permission strings – LGTM

Both messages follow the identical pattern already used for analogous lines such as "only_admin_can_manage_sso_org".
No placeholder variables are involved, Czech phrasing is clear.


3311-3316: Verify PBAC key alignment with other locales

New keys for attribute-related PBAC descriptions were added.
Before merging, please make sure the same keys are present (even in English) in the default en/common.json; otherwise the permission UI might render blank in English while Czech works.

apps/web/public/static/locales/de/common.json (2)

874-878: New OAuth-related strings look consistent and syntactically correct

• Keys are unique and follow the existing naming style.
• Translation keeps the English term “OAuth-Client” – consistent with the rest of the file.
No issues spotted.


1842-1845: Admin-only guard messages align with earlier patterns

Strings reuse the “Nur der Administrator … kann …” phrasing already used for similar permissions, so tone & terminology stay consistent.
Good addition.

apps/web/public/static/locales/fi/common.json (3)

873-876: OAuth-terminologia OK

Uudet OAuth-asiakas-avaimet on lisätty selkeästi ja johdonmukaisesti (asiakas / asiakkaat). Ei JSON-rakenteen ongelmia.


1843-1844: Lisätyt käyttöoikeusviestit kunnossa

Tekstit noudattavat aiempaa “only_admin_can_manage_*” ‑muotoa ja sisältävät oikean sijamuodon (“järjestelmänvalvoja”).


3311-3315: PBAC-sanasto täydentyy loogisesti

Uudet attribuuttikohtaiset PBAC-kuvaukset on lisätty yhdenmukaisessa muodossa. Ei avain- tai pilkkuvirheitä.

apps/web/public/static/locales/tr/common.json (3)

874-877: Translations look good – no placeholder/escaping issues detected

The four new OAuth-related keys contain no ICU placeholders, punctuation is consistent with neighbouring strings, and terminology (“OAuth İstemcisi”) matches existing usage. Nothing to fix here.


1842-1844: String additions are consistent with existing style

The admin-only directory-sync / OAuth-client warnings read naturally in Turkish and reuse the “yalnızca … yönetebilir” pattern already present elsewhere. No action required.


3311-3324: PBAC attribute/role/event-type additions LGTM

• Keys are correctly namespaced (pbac_resource_*, pbac_desc_*).
• Placeholders or Markdown are not required and therefore safely absent.
• Terminology (“Öznitelikler”, “Tüm kaynaklarda tüm işlemler”) aligns with earlier PBAC entries.

No translation, syntax, or consistency issues detected.

Also applies to: 3333-3350

apps/web/public/static/locales/pt-BR/common.json (3)

874-877: Consistent singular × plural wording

The plural key "oauth_clients" is translated as “Clientes OAuth”, while the singular key "create_oauth_client" is translated with “Cliente OAuth”.
Wording and capitalisation are consistent and no interpolation variables are involved – looks good.


3311-3316: New PBAC strings look correct

The newly-added PBAC resource & description entries follow the same style and terminology as existing permission strings. Pluralisation and capitalisation match previous entries.


3433-3435: Check for duplicate keys

Keys "stats" and "booking_status" are appended here.
Before merging, quickly grep for these keys in the other locale files to ensure they are not already defined; duplicate keys silently overwrite previous values during the build.

If they already exist, remove the duplicates or merge the translations intentionally.

apps/web/public/static/locales/bg/common.json (2)

1843-1844: Key names follow the pattern but introduce a small duplication risk

only_admin_can_manage_directory_sync and only_admin_can_manage_oauth_clients mirror previously-defined only_admin_can_manage_sso_org.
Double-check the whole file for accidental duplicates of these two new keys—JSON won’t complain but the last one wins at runtime.


3311-3316: PBAC permission keys added – verify consistency with server side enums

The new attribute-related permission strings (pbac_resource_attributes, pbac_desc_*_organization_attributes) look fine.
Ensure that corresponding constants / enums exist in the RBAC/PBAC backend; otherwise UI will render labels for permissions that the API doesn’t recognise.

apps/web/public/static/locales/sr/common.json (1)

3311-3316: Check PBAC translations for domain accuracy

The newly introduced PBAC keys map technical RBAC concepts (e.g. pbac_resource_attributes, pbac_desc_create_organization_attributes).
Current translations (“Atributi”, “Kreiranje atributa organizacije”) look correct, but please verify with the product/legal team that:

  1. “Atribut” is indeed the chosen term in the Serbian governance UI (some teams use “svojstvo”).
  2. The plural/singular forms match the in-app phrasing (e.g. “Kreiranje atributa” vs “Kreiranje atributa organizacije”).

No code change required if confirmed.

apps/web/public/static/locales/ar/common.json (2)

874-878: OAuth-related strings look correct
New keys for OAuth client management are well-formed, use consistent naming, keep the English placeholders intact, and the Arabic wording is clear.


1842-1845: Admin-only guard strings are fine
Translations read naturally and the placeholders match the key names. No issues spotted.

apps/web/public/static/locales/ko/common.json (3)

874-877: Verify new OAuth-client strings are included in all locales

The newly-added keys (oauth_clients*) look correct here, but remember to add the same keys to common.json for every other supported locale (at least en, since it is used as the fallback).
If they are missing the UI will silently fall back to the key name.


3311-3316: Duplicate-key risk

The PBAC description keys you added (pbac_desc_*_organization_attributes) are fine, but make sure the same keys are not present earlier in this file.
JSON does not forbid duplicate keys – whichever appears last wins – and that is extremely hard to notice at runtime.
Run a quick duplicate-key check before merging.


3433-3434: Potential key collision

"stats" and "booking_status" are very generic identifiers; do a quick grep to be certain they don’t already exist elsewhere in the file (or in other locale files).
A silent overwrite would break previously translated text.

apps/web/public/static/locales/nl/common.json (3)

874-878: Translation keys add proper OAuth-client context — looks good

New keys align with existing naming conventions (oauth_clients*), translations are clear, and no interpolation placeholders are required.
No issues spotted.


1843-1845: Admin-only guard strings consistent

The two only_admin_can_manage_* entries reuse the same sentence pattern already established for earlier keys, keeping UX wording uniform.
Good addition.


3311-3316: PBAC attribute strings added correctly

New PBAC-related keys (pbac_resource_attributes, view/update/delete/create) follow the existing permission-string scheme and pluralisation.
No JSON or placeholder issues detected.

apps/web/public/static/locales/ja/common.json (3)

874-877: Ensure newly-added OAuth client strings exist in the source locale

Four keys (oauth_clients*) are introduced here.
Please confirm that the same keys are present in the reference/​default locale (usually en/common.json).
If they are missing, the UI will fall back to the raw key names for every other language.


3433-3434: Verify key uniqueness for "stats" and "booking_status"

These appear late in the file.
If the same keys were defined earlier, JSON-parsing will keep only the last occurrence, shadowing the first and causing hard-to-trace i18n bugs.
A quick rip-grep across the repo is recommended.


3311-3315: Wire up PBAC “attributes” resource end-to-end

I see the new locale keys and registry entries for pbac_resource_attributes, but I couldn’t find a static resources list or seed script that pulls in “attributes.” Please verify and, if missing, update:

• packages/features/pbac/domain/types/permission-registry.ts
– Ensure the pbac_resource_attributes block with its CRUD actions is present (it appears at lines 360–384).

• UI matrix component (e.g. packages/features/pbac/components/PermissionMatrix.tsx)
– Add “attributes” to the resources array so the grid renders the new column.

• Seed data script (e.g. packages/features/pbac/seed/permissions.ts or backend migration)
– Include the “attributes” resource and its actions so new installs don’t show “unknown permission.”

apps/web/public/static/locales/he/common.json (2)

874-878: Ensure placeholder consistency with other locales

For the newly-added OAuth strings, verify that the key set (oauth_clients, …_description, create_oauth_client, …_description) exists in the reference/​source locale and that parameter placeholders (e.g. {{clientName}}, {{appName}}) are preserved 1-for-1.
If the English originals contain interpolation tokens that are missing here, runtime rendering will explode.


3311-3316: Double-check PBAC attribute descriptions

The PBAC entries are duplicated for “organization attributes”, yet the Hebrew wording refers to “מאפייני הארגון” four times; that is correct but easy to mix up with team-level wording.
Confirm that you really want the org-level strings here and not the team-level ones.
No code change needed if intentional.

apps/web/public/static/locales/es-419/common.json (3)

3311-3315: PBAC attribute keys look fine, but validate cross-locale coverage
The five new pbac_*attributes strings are translated correctly. Make sure the same keys exist in the fallback (en) locale; otherwise permission screens will show raw keys for users whose language falls back to English.


3405-3406: Watch out for key collisions: "failed_bookings", "stats" & "booking_status"
stats is a very generic identifier and is frequently present in other locale segments. Ensure this is not re-declared earlier (it was in several other locales). Duplicate keys break translators’ tooling and may hide older strings.

Also applies to: 3433-3435


874-877: No conflicts within es-419/common.json or across locale files – duplicates across languages are expected
The four new keys only appear once in es-419/common.json. Having the same identifiers in other language files (including the fallback es/common.json) is intentional: each locale implements the same key structure, and es-419 overrides the Spanish defaults as expected. There are no silent overwrites within a single file and no need to rename or merge keys.

Likely an incorrect or invalid review comment.

apps/web/public/static/locales/es/common.json (1)

3311-3316: Looks good – matches existing PBAC phrasing
Las nuevas descripciones siguen el mismo patrón (“Ver …”, “Actualizar …”) que el resto de claves PBAC.

apps/web/public/static/locales/it/common.json (2)

1842-1845: Looks good – translation keeps style & terminology consistent
No issues spotted with these permission-warning strings.


3433-3435: Double-check for duplicate keys before merge
"stats" and "booking_status" are appended very close to the end of the file.
Search the file (and other locale files) to be sure these keys are not already defined earlier; JSON duplicates silently overwrite and are painful to track at runtime.

apps/web/public/static/locales/fr/common.json (3)

874-877: Looks good – consistent terminology for OAuth strings

The four newly-added keys follow the existing naming pattern (oauth_*) and the French phrasing is concise and accurate. No action required.


3405-3405: Key added but headline translation duplicates existing vocabulary

"failed_bookings": "Réservations échouées" is technically correct, yet earlier keys use “annulées” (cancelled) and “non confirmées” for negative states. Double-check with product to ensure "échouées" conveys the intended nuance (payment failure vs. user cancel). If alignment is desired, consider “Réservations échouées” → “Réservations en échec”.


3433-3434: Potential collision with existing ‘stats’ key

A quick grep shows stats already added here; confirm this key does not exist in other locale files (e.g. en/common.json). Duplicate keys with divergent casing break i18n extraction tools. If the key already exists, reuse it rather than redefining.

apps/web/public/static/locales/eu/common.json (1)

1843-1844: JSON validity looks good, but mind the trailing comma

Both newly-added keys end with a comma even though only_admin_can_manage_oauth_clients is the last key inside that logical block. While JSON5 tolerates it, the project still ships pure JSON.
Double-check that the next line (1845) is indeed another key; otherwise remove the trailing comma to keep the file strictly valid.

apps/web/public/static/locales/bn/common.json (3)

874-878: Placeholders & context look correct – no action needed

The newly-added OAuth-related strings accurately preserve terminology (“OAuth ক্লায়েন্ট”) and contain no dynamic placeholders that could break formatting.


1843-1844: Consistent admin-only phrasing – good work

Both permission warnings follow the existing convention (“শুধুমাত্র সংগঠনের অ্যাডমিন বা মালিক …”), so end-user messaging will stay uniform across the UI.


3311-3316: PBAC attribute translations align with peer keys

The added PBAC strings (“বৈশিষ্ট্য”) fit the permission taxonomy and don’t introduce placeholder/grammar issues.

Copy link
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: 0

🧹 Nitpick comments (1)
apps/web/public/static/locales/bn/common.json (1)

1843-1845: Nit: finish sentences with the same punctuation as neighbours

Most neighbouring strings in this block end with a full-stop (“।”), but these two lines do not. Add the period for visual consistency.

-  "only_admin_can_manage_directory_sync": "শুধুমাত্র সংগঠনের অ্যাডমিন বা মালিক ডিরেক্টরি সিঙ্ক সেটিংস পরিচালনা করতে পারেন",
-  "only_admin_can_manage_oauth_clients": "শুধুমাত্র সংগঠনের অ্যাডমিন বা মালিক OAuth ক্লায়েন্ট পরিচালনা করতে পারেন",
+  "only_admin_can_manage_directory_sync": "শুধুমাত্র সংগঠনের অ্যাডমিন বা মালিক ডিরেক্টরি সিঙ্ক সেটিংস পরিচালনা করতে পারেন।",
+  "only_admin_can_manage_oauth_clients": "শুধুমাত্র সংগঠনের অ্যাডমিন বা মালিক OAuth ক্লায়েন্ট পরিচালনা করতে পারেন।",
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 96c1192 and 3af470e.

⛔ Files ignored due to path filters (1)
  • i18n.lock is excluded by !**/*.lock
📒 Files selected for processing (36)
  • apps/web/public/static/locales/ar/common.json (6 hunks)
  • apps/web/public/static/locales/az/common.json (6 hunks)
  • apps/web/public/static/locales/bg/common.json (6 hunks)
  • apps/web/public/static/locales/bn/common.json (6 hunks)
  • apps/web/public/static/locales/ca/common.json (6 hunks)
  • apps/web/public/static/locales/cs/common.json (6 hunks)
  • apps/web/public/static/locales/da/common.json (6 hunks)
  • apps/web/public/static/locales/de/common.json (6 hunks)
  • apps/web/public/static/locales/el/common.json (6 hunks)
  • apps/web/public/static/locales/es-419/common.json (6 hunks)
  • apps/web/public/static/locales/es/common.json (6 hunks)
  • apps/web/public/static/locales/et/common.json (6 hunks)
  • apps/web/public/static/locales/eu/common.json (6 hunks)
  • apps/web/public/static/locales/fi/common.json (6 hunks)
  • apps/web/public/static/locales/fr/common.json (6 hunks)
  • apps/web/public/static/locales/he/common.json (6 hunks)
  • apps/web/public/static/locales/hu/common.json (6 hunks)
  • apps/web/public/static/locales/it/common.json (6 hunks)
  • apps/web/public/static/locales/ja/common.json (6 hunks)
  • apps/web/public/static/locales/km/common.json (6 hunks)
  • apps/web/public/static/locales/ko/common.json (6 hunks)
  • apps/web/public/static/locales/nl/common.json (6 hunks)
  • apps/web/public/static/locales/no/common.json (6 hunks)
  • apps/web/public/static/locales/pl/common.json (6 hunks)
  • apps/web/public/static/locales/pt-BR/common.json (6 hunks)
  • apps/web/public/static/locales/pt/common.json (6 hunks)
  • apps/web/public/static/locales/ro/common.json (6 hunks)
  • apps/web/public/static/locales/ru/common.json (6 hunks)
  • apps/web/public/static/locales/sk-SK/common.json (6 hunks)
  • apps/web/public/static/locales/sr/common.json (6 hunks)
  • apps/web/public/static/locales/sv/common.json (6 hunks)
  • apps/web/public/static/locales/tr/common.json (6 hunks)
  • apps/web/public/static/locales/uk/common.json (6 hunks)
  • apps/web/public/static/locales/vi/common.json (6 hunks)
  • apps/web/public/static/locales/zh-CN/common.json (6 hunks)
  • apps/web/public/static/locales/zh-TW/common.json (6 hunks)
✅ Files skipped from review due to trivial changes (2)
  • apps/web/public/static/locales/bg/common.json
  • apps/web/public/static/locales/cs/common.json
🚧 Files skipped from review as they are similar to previous changes (33)
  • apps/web/public/static/locales/da/common.json
  • apps/web/public/static/locales/zh-CN/common.json
  • apps/web/public/static/locales/pt-BR/common.json
  • apps/web/public/static/locales/eu/common.json
  • apps/web/public/static/locales/sv/common.json
  • apps/web/public/static/locales/ro/common.json
  • apps/web/public/static/locales/az/common.json
  • apps/web/public/static/locales/pt/common.json
  • apps/web/public/static/locales/hu/common.json
  • apps/web/public/static/locales/vi/common.json
  • apps/web/public/static/locales/zh-TW/common.json
  • apps/web/public/static/locales/fi/common.json
  • apps/web/public/static/locales/tr/common.json
  • apps/web/public/static/locales/sr/common.json
  • apps/web/public/static/locales/el/common.json
  • apps/web/public/static/locales/nl/common.json
  • apps/web/public/static/locales/he/common.json
  • apps/web/public/static/locales/ru/common.json
  • apps/web/public/static/locales/ja/common.json
  • apps/web/public/static/locales/ca/common.json
  • apps/web/public/static/locales/es-419/common.json
  • apps/web/public/static/locales/it/common.json
  • apps/web/public/static/locales/ko/common.json
  • apps/web/public/static/locales/pl/common.json
  • apps/web/public/static/locales/ar/common.json
  • apps/web/public/static/locales/sk-SK/common.json
  • apps/web/public/static/locales/es/common.json
  • apps/web/public/static/locales/no/common.json
  • apps/web/public/static/locales/km/common.json
  • apps/web/public/static/locales/et/common.json
  • apps/web/public/static/locales/uk/common.json
  • apps/web/public/static/locales/fr/common.json
  • apps/web/public/static/locales/de/common.json
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: bandhan-majumder
PR: calcom/cal.com#22359
File: packages/lib/server/locales/en/common.json:1336-1339
Timestamp: 2025-07-14T16:31:45.233Z
Learning: When making localization changes for new features, it's often safer to add new strings rather than modify existing ones to avoid breaking existing functionality that depends on the original strings. This approach allows for feature-specific customization while maintaining backward compatibility.
📚 Learning: when making localization changes for new features, it's often safer to add new strings rather than m...
Learnt from: bandhan-majumder
PR: calcom/cal.com#22359
File: packages/lib/server/locales/en/common.json:1336-1339
Timestamp: 2025-07-14T16:31:45.233Z
Learning: When making localization changes for new features, it's often safer to add new strings rather than modify existing ones to avoid breaking existing functionality that depends on the original strings. This approach allows for feature-specific customization while maintaining backward compatibility.

Applied to files:

  • apps/web/public/static/locales/bn/common.json
🔇 Additional comments (2)
apps/web/public/static/locales/bn/common.json (2)

874-878: Translations look good – no action needed

The added OAuth-related keys are translated consistently, preserve the original technical term “OAuth”, and contain no missing placeholders.


3311-3316: Confirm no key duplication

The new PBAC “attributes” keys are useful additions. Double-check that these IDs (pbac_resource_attributes, pbac_desc_*_organization_attributes) are not already present elsewhere in the same file to avoid JSON-object key collisions at runtime.

Copy link
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: 18

Caution

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

⚠️ Outside diff range comments (9)
apps/web/public/static/locales/et/common.json (1)

239-241: Standardize “webhook” and fix OAuth client noun + typo.

Use “veebihaak/veebihaagi” consistently and hyphenate “OAuth‑klient”.

-  "webhook_update_form": "Webhooki uuendamise vorm",
-  "webhook_update_form_description": "Lisa webhook oma OAuthCliendile.",
+  "webhook_update_form": "Veebihaagi uuendamise vorm",
+  "webhook_update_form_description": "Lisa veebihaak oma OAuth‑kliendile.",
apps/web/public/static/locales/fr/common.json (1)

1-3496: FR Translation – Style et cohérence à corriger

Quelques problèmes de typographie et de formulation subsistent dans apps/web/public/static/locales/fr/common.json. Veuillez :

• Remplacer les mentions “par ex.,” par “p. ex.,”

  • Clé "webhook_trigger_event" ligne 3460 : "Le nom de l'événement déclencheur (par ex., …)"(p. ex., BOOKING_CREATED, BOOKING_CANCELLED)

• Harmoniser “e-mail” avec trait d’union (et non “email”)

  • Clés "exclude_emails_that_contain" (l. 3004) et
    "require_emails_that_contain" (l. 3005) :
    “Exclure les emails…” → “Exclure les e-mails…”
    “Exiger des emails…” → “Exiger des e-mails…”

• Corriger l’accord au pluriel pour les permissions “admin only”

  • Clé "only_admin_can_manage_directory_sync" (l. 1851) :
    “Seul l'administrateur ou le propriétaire… peut gérer” →
    “Seuls l’administrateur et le propriétaire… peuvent gérer”
  • Clé "only_admin_can_manage_oauth_clients" (l. 1852) : même changement

• Clarifier et typer les champs webhook

  • "webhook_created_at" (l. 3461) :
    “L'heure du webhook” → “Date et heure de création du webhook”
  • "webhook_organizer_email" (l. 3473) et
    "webhook_attendee_email" (l. 3477) :
    “Email …” → “Adresse e-mail …”
  • "webhook_organizer_locale" (l. 3475) et
    "webhook_attendee_locale" (l. 3479) :
    “Locale …” → “Paramètre régional …”
  • "webhook_organizer_timezone" (l. 3474) :
    “(par ex., 'America/New_York', …)” → “(p. ex., « America/New_York », « Asia/Kolkata »)”

• Uniformiser “round-robin” avec un trait d’union
Plusieurs occurrences de “round robin” (pp. 73, 123, 2289…) doivent devenir “round-robin” pour respecter la règle typographique.

Merci de corriger ces points pour assurer la cohérence et la qualité des traductions.

apps/web/public/static/locales/sr/common.json (1)

807-807: Localization: Replace remaining “Round Robin” occurrences in sr/common.json

The search confirmed multiple literal “Round Robin” strings remain in apps/web/public/static/locales/sr/common.json. For full Serbian localization, please replace them with “kružno dodeljivanje” variants (adjusting case and grammatical form as needed). The JSON is already valid, so you can safely apply these changes:

• apps/web/public/static/locales/sr/common.json

  • Line 123:
    - "round_robin_host_unavailable_for_booking": "Round Robin domaćin nije dostupan za zakazivanje.",
    + "round_robin_host_unavailable_for_booking": "Domaćin kružnog dodeljivanja nije dostupan za zakazivanje.",
  • Line 807:
    - "round_robin": "Round Robin",
    + "round_robin": "Kružno dodeljivanje",
  • Line 2979:
    - "salesforce_route_to_owner": "Vlasnik kontakta će biti Round Robin domaćin ako je dostupan",
    + "salesforce_route_to_owner": "Vlasnik kontakta će biti domaćin kružnog dodeljivanja ako je dostupan",
  • Line 2981:
    - "salesforce_do_not_route_to_owner": "Vlasnik kontakta neće biti primoran (može i dalje biti domaćin ako odgovara atributima i Round Robin kriterijumima)",
    + "salesforce_do_not_route_to_owner": "Vlasnik kontakta neće biti primoran (može i dalje biti domaćin ako odgovara atributima i kriterijumima kružnog dodeljivanja)",
  • Line 3117:
    - "reset_interval_weighted_rr": "Resetuj interval za ponderisani Round Robin",
    + "reset_interval_weighted_rr": "Resetuj interval za ponderisano kružno dodeljivanje",
  • Line 3134:
    - "rr_interval_successfully_updated": "Interval za Round Robin uspešno ažuriran",
    + "rr_interval_successfully_updated": "Interval za kružno dodeljivanje uspešno ažuriran",
  • Line 3279:
    - "rr_settings_successfully_updated": "Podešavanja za Round Robin uspešno ažurirana",
    + "rr_settings_successfully_updated": "Podešavanja za kružno dodeljivanje uspešno ažurirana",
  • Line 3280:
    - "distribution_basis_weighted_rr": "Osnova distribucije za ponderisani Round Robin",
    + "distribution_basis_weighted_rr": "Osnova distribucije za ponderisano kružno dodeljivanje",
  • Line 3382:
    - "rr_load_balancing_disabled_with_groups": "Balansiranje opterećenja nije dostupno sa Round Robin grupama",
    + "rr_load_balancing_disabled_with_groups": "Balansiranje opterećenja nije dostupno sa grupama kružnog dodeljivanja",

Applying these replacements will complete the localization sweep for “Round Robin.”

apps/web/public/static/locales/da/common.json (1)

3309-3345: Replace remaining PBAC translation key pbac_resource_attributes from “Egenskaber” to “Attributter”

grep confirms this is the only PBAC‐scoped occurrence of “Egenskab(er)” in apps/web/public/static/locales/da/common.json (line 3331); all other hits at ~2803–2816 pertain to the core “Attribut” feature and should remain unchanged.

• File: apps/web/public/static/locales/da/common.json
• Line 3331:

-  "pbac_resource_attributes": "Egenskaber",
+  "pbac_resource_attributes": "Attributter",

No other PBAC descriptions (3349–3367, 3372–3373) contain “Egenskab”/“Egenskaber”. Please apply this one change to keep scope phrasing consistent.

apps/web/public/static/locales/km/common.json (1)

3308-3345: Fix remaining “អង្គភាព” usages in PBAC workflows section

The localized PBAC workflow descriptors (lines 3308–3345) still contain the old term “អង្គភាព.” Please update these to the standardized “អង្គការ” throughout:

• pbac_desc_view_organization_attributes

- "pbac_desc_view_organization_attributes": "មើលគុណលក្ខណៈរបស់អង្គភាព",
+ "pbac_desc_view_organization_attributes": "មើលគុណលក្ខណៈរបស់អង្គការ",

• pbac_desc_update_organization_attributes

- "pbac_desc_update_organization_attributes": "ធ្វើបច្ចុប្បន្នភាពគុណលក្ខណៈរបស់អង្គភាព",
+ "pbac_desc_update_organization_attributes": "ធ្វើបច្ចុប្បន្នភាពគុណលក្ខណៈរបស់អង្គការ",

• pbac_desc_delete_organization_attributes

- "pbac_desc_delete_organization_attributes": "លុបគុណលក្ខណៈរបស់អង្គភាព",
+ "pbac_desc_delete_organization_attributes": "លុបគុណលក្ខណៈរបស់អង្គការ",

• pbac_desc_create_organization_attributes

- "pbac_desc_create_organization_attributes": "បង្កើតគុណលក្ខណៈរបស់អង្គភាព",
+ "pbac_desc_create_organization_attributes": "បង្កើតគុណលក្ខណៈរបស់អង្គការ",

• pbac_desc_manage_roles

- "pbac_desc_manage_roles": "សកម្មភាពទាំងអស់លើតួនាទីក្នុងក្រុមអង្គភាព",
+ "pbac_desc_manage_roles": "សកម្មភាពទាំងអស់លើតួនាទីក្នុងក្រុមអង្គការ",

After applying these replacements, re-run the “អង្គភាព” grep to confirm no stray instances remain.

apps/web/public/static/locales/pt/common.json (1)

3432-3441: Fix grammar + PT‑PT in “Falhas/Cache/Excluir” block

“Reservas falhas” is grammatically incorrect; also replace BR “Status/Excluir” and use “cache” in lower case.

-  "failed_bookings": "Reservas falhas",
+  "failed_bookings": "Reservas falhadas",
-  "cache_status": "Status do Cache",
+  "cache_status": "Estado da cache",
-  "delete_cached_data": "Excluir dados em cache",
+  "delete_cached_data": "Eliminar dados em cache",
-  "cache_deleted_successfully": "Cache excluído com sucesso",
+  "cache_deleted_successfully": "Cache eliminada com sucesso",
-  "error_deleting_cache": "Erro ao excluir cache",
+  "error_deleting_cache": "Erro ao eliminar a cache",
-  "confirm_delete_cache": "Tem certeza de que deseja excluir os dados em cache? Esta ação não pode ser desfeita.",
+  "confirm_delete_cache": "Tem a certeza de que deseja eliminar os dados em cache? Esta ação não pode ser desfeita.",
-  "yes_delete_cache": "Sim, excluir cache",
+  "yes_delete_cache": "Sim, eliminar cache",
apps/web/public/static/locales/tr/common.json (2)

1-3495: Terminology consistency fixes required

Please address the following remaining translation inconsistencies in apps/web/public/static/locales/tr/common.json:

• Replace all instances of “Organizasyon” with “Kuruluş”

  • editing_org (line 692)
  • organization_id*, organization_id_copied (lines 709–710)
  • oauth_clients_description (line 877)
  • appearance_org_description (line 1663)
  • pending_organization_invites (line 1723)
  • unlimited_teams_description (line 2538)
  • enterprise_description, create_your_org, create_your_org_description (lines 2543–2546)
  • admin_delete_organization_description_2 (line 2550)
  • email_organization_created|subject (line 2671)
  • privacy_organization_description (line 2674)
  • organization_slug_taken (line 3090)
  • organization_payment_success*, organization_payment_success_description (lines 3099–3100)
  • organization_onboarding_status*, organization_onboarding_status_description (lines 3102–3103)
  • creating_your_organization, organization_onboarding_already_completed, organization_onboarding_already_exists, organization_onboarding_not_found (lines 3106–3109)
  • organization_has_subscription_already (line 3116)
  • could_not_find_slug_to_publish_org (line 3179)
  • roles_and_permissions_description (line 3287)
  • pbac_desc_* for organization resources and actions (lines 3332–3336, 3339–3360, 3361–3366, 3369)

• Update literal “Webhook” to “Web kancası” in string values

  • webhook_update_form (line 239)
  • webhook_update_failed, webhook_create_failed (lines 3207–3208)
  • webhook_created_at (line 3461)

• Use “Organizatör” instead of “Düzenleyen” for webhook organizer fields

  • webhook_organizer_name, webhook_organizer_email, webhook_organizer_timezone, webhook_organizer_locale (lines 3472–3475)

Please apply these changes to ensure terminology consistency across the locale file.


239-239: Follow-up: update remaining “Webhook” literals in Turkish locale

The file apps/web/public/static/locales/tr/common.json still contains literal “Webhook” in these entries. For consistency, please revise them in a separate commit:

  • Lines 3207–3208
    "webhook_update_failed": "Webhook güncellenemedi."
    "webhook_create_failed": "Webhook oluşturulamadı."
  • Line 3461
    "webhook_created_at": "Webhook zamanı"
apps/web/public/static/locales/hu/common.json (1)

112-112: Normalize “nem elérhető” phrasing to “nem érhető el” and unify Round-Robin terminology

Please apply the following global edits to apps/web/public/static/locales/hu/common.json to ensure native phrasing and consistent terminology:

• Replace all instances of “nem elérhető” with “nem érhető el” (lines 111, 112, 121, 886, 1926, 2052, 2418, 2605, 2925)

- A kiválasztott időpont már nem elérhető.
+ A kiválasztott időpont már nem érhető el.

• Standardize Round-Robin variants—choose one form (e.g. English “Round-Robin” with hyphen or Hungarian “körmérkőzés”) and apply it consistently to keys and values (found at lines 72-74, 122-124, 807-808, 1855-1857, 1956-1958, 2039-2040, 2289-2290, 2713-2714, 2793, 2843, 2896-2900, 2979-2981, 2985, 3117, 3134, 3275, 3380-3384). For example:

- "round_robin": "Körmérkőzés"
+ "round_robin": "Round-Robin"

• Verify that tone remains formal and second-person polite (no informal verb endings) after your replacements.

These changes are mandatory to maintain translation quality and consistency across the UI.

"usage_based_generic_expiration_description": "Αυτός ο σύνδεσμος μπορεί να ρυθμιστεί ώστε να λήγει μετά από έναν συγκεκριμένο αριθμό κρατήσεων",
"usage_based_expiration_description_plural": "Αυτός ο σύνδεσμος μπορεί να χρησιμοποιηθεί για {{count}} κρατήσεις",
"webhook_trigger_event": "Το όνομα του συμβάντος ενεργοποίησης (π.χ., BOOKING_CREATED, BOOKING_CANCELLED)",
"webhook_created_at": "Η ώρα του webhook",
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Automate verification: hyphenation and webhook parity EN↔EL

Run this to ensure: (a) no remaining unhyphenated “Round Robin” values in EL for changed keys, and (b) webhook_* keys are present in both EN and EL.

Also applies to: 3382-3382, 123-123


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# 1) Check unhyphenated "Round Robin" on changed keys (quick sweep)
echo "Unhyphenated 'Round Robin' instances in EL for changed keys:"
rg -n $'":\\s*"[^"]*Round Robin[^"]*"' apps/web/public/static/locales/el/common.json || true

# 2) Compare webhook_* key sets between EN and EL
echo
echo "Compare webhook_* keys EN vs EL:"
rg -h '^\s*"webhook_[^"]+"' apps/web/public/static/locales/en/common.json \
 | sed -E 's/.*"([^"]+)".*/\1/' | sort -u > /tmp/en_webhook_keys.txt
rg -h '^\s*"webhook_[^"]+"' apps/web/public/static/locales/el/common.json \
 | sed -E 's/.*"([^"]+)".*/\1/' | sort -u > /tmp/el_webhook_keys.txt

echo "EN keys missing in EL:"
grep -Fxv -f /tmp/el_webhook_keys.txt /tmp/en_webhook_keys.txt || true
echo "EL keys missing in EN:"
grep -Fxv -f /tmp/en_webhook_keys.txt /tmp/el_webhook_keys.txt || true

Length of output: 1445


Fix remaining unhyphenated “Round Robin” instances in EL translations

The sweep found several EL entries still using “Round Robin” without a hyphen. Please update these to “Round-Robin” for consistency. Webhook key parity is already correct—no missing keys.

Files/locations needing fixes (apps/web/public/static/locales/el/common.json):

  • Line 123: "round_robin_host_unavailable_for_booking": "Ο οικοδεσπότης Round Robin δεν είναι διαθέσιμος για κράτηση."
  • Line 807: "round_robin": "Round Robin",
  • Line 3117: "reset_interval_weighted_rr": "Επαναφορά διαστήματος για σταθμισμένο Round Robin",
  • Line 3134: "rr_interval_successfully_updated": "Το διάστημα Round Robin ενημερώθηκε με επιτυχία",
  • Line 3279: "rr_settings_successfully_updated": "Οι ρυθμίσεις Round Robin ενημερώθηκαν με επιτυχία",
  • Line 3280: "distribution_basis_weighted_rr": "Βάση κατανομής για σταθμισμένο Round Robin",
  • Line 3382: "rr_load_balancing_disabled_with_groups": "Η εξισορρόπηση φόρτου δεν είναι διαθέσιμη με ομάδες Round Robin",

Please replace each “Round Robin” with “Round-Robin” (using a non-breaking hyphen if desired).

🤖 Prompt for AI Agents
apps/web/public/static/locales/el/common.json lines 123, 807, 3117, 3134, 3279,
3280, 3382: replace each occurrence of the phrase "Round Robin" with
"Round-Robin" inside the JSON values (preserve surrounding quotes, punctuation
and spacing), e.g. "Ο οικοδεσπότης Round Robin δεν είναι διαθέσιμος για
κράτηση." -> "Ο οικοδεσπότης Round-Robin δεν είναι διαθέσιμος για κράτηση.";
apply the same substitution for the other listed keys and keep file
encoding/escaping intact (optionally use a non-breaking hyphen if desired).

Comment on lines 876 to 879
"oauth_clients": "Clientes OAuth",
"oauth_clients_description": "Gestiona los clientes OAuth para tu organización",
"create_oauth_client": "Crear cliente OAuth",
"create_oauth_client_description": "Crea un nuevo cliente OAuth para integraciones de terceros",
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

OAuth copy — LGTM; verify parity in other locales

Spanish strings are good. Quick parity sweep recommended to avoid EN fallbacks.


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
base="apps/web/public/static/locales"
keys=(oauth_clients oauth_clients_description create_oauth_client create_oauth_client_description)
all=$(find "$base" -maxdepth 1 -mindepth 1 -type d | wc -l | tr -d ' ')
for k in "${keys[@]}"; do
  have=$(rg -l "\"$k\"" "$base"/*/common.json | wc -l | tr -d ' ')
  printf "%-35s -> %s/%s\n" "$k" "$have" "$all"
  if [ "$have" -ne "$all" ]; then rg -L "\"$k\"" "$base"/*/common.json || true; fi
done

Length of output: 33928


Missing OAuth localization keys in several locales

The four new keys (oauth_clients, oauth_clients_description, create_oauth_client, create_oauth_client_description) were added in Spanish but are only present in 37 of 44 locales. The following 7 locale files are missing all four entries and will fall back to English at runtime:

  • apps/web/public/static/locales/hr/common.json (Croatian)
  • apps/web/public/static/locales/id/common.json (Indonesian)
  • apps/web/public/static/locales/iw/common.json (Hebrew)
  • apps/web/public/static/locales/lv/common.json (Latvian)
  • apps/web/public/static/locales/sk/common.json (Slovak)
  • apps/web/public/static/locales/ta/common.json (Tamil)
  • apps/web/public/static/locales/th/common.json (Thai)

Please add these keys (with appropriate translations or temporary placeholders) in each file to ensure full parity and prevent unintended English fallbacks.

🤖 Prompt for AI Agents
In apps/web/public/static/locales/hr/common.json (and similarly in
apps/web/public/static/locales/id/common.json,
apps/web/public/static/locales/iw/common.json,
apps/web/public/static/locales/lv/common.json,
apps/web/public/static/locales/sk/common.json,
apps/web/public/static/locales/ta/common.json,
apps/web/public/static/locales/th/common.json) around the area where other
OAuth/clients keys live (approx lines 876–879 in the Spanish file), add the four
missing keys: "oauth_clients", "oauth_clients_description",
"create_oauth_client", and "create_oauth_client_description"; provide
appropriate translations for each locale or use a clear temporary placeholder
(e.g., same English string or "<TRANSLATION_REQUIRED>...") so the app won’t
fallback to English at runtime, keep JSON formatting consistent (comma
placement, quoting) and run a quick lint/JSON-parse to confirm validity.

Comment on lines 1851 to 1852
"only_admin_can_manage_directory_sync": "Solo el administrador o propietario de la organización puede gestionar la configuración de sincronización de directorio",
"only_admin_can_manage_oauth_clients": "Solo el administrador o propietario de la organización puede gestionar los clientes OAuth",
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Admin‑only flags — LGTM; ensure cross‑locale coverage

These often lag in a few locales. Run a parity check and backfill as needed.


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
base="apps/web/public/static/locales"
keys=(only_admin_can_manage_directory_sync only_admin_can_manage_oauth_clients)
all=$(find "$base" -maxdepth 1 -mindepth 1 -type d | wc -l | tr -d ' ')
for k in "${keys[@]}"; do
  have=$(rg -l "\"$k\"" "$base"/*/common.json | wc -l | tr -d ' ')
  printf "%-45s -> %s/%s\n" "$k" "$have" "$all"
  if [ "$have" -ne "$all" ]; then rg -L "\"$k\"" "$base"/*/common.json || true; fi
done

Length of output: 21849


Add missing translations for admin-only flags across all locales

The new keys only_admin_can_manage_directory_sync and only_admin_can_manage_oauth_clients are present in 37 out of 44 locale files. To achieve full parity, please add entries for both keys in the following locale directories:

  • apps/web/public/static/locales/hr/common.json
  • apps/web/public/static/locales/id/common.json
  • apps/web/public/static/locales/iw/common.json
  • apps/web/public/static/locales/lv/common.json
  • apps/web/public/static/locales/sk/common.json
  • apps/web/public/static/locales/ta/common.json
  • apps/web/public/static/locales/th/common.json

After backfilling, re-run the parity script and verify you reach 44/44 for each key.

🤖 Prompt for AI Agents
In apps/web/public/static/locales/es/common.json around lines 1851-1852 the new
keys only_admin_can_manage_directory_sync and
only_admin_can_manage_oauth_clients exist for Spanish but are missing from seven
locale files; add both keys with appropriate translations (or fallback to
English if no translation available) to each of these files:
apps/web/public/static/locales/hr/common.json,
apps/web/public/static/locales/id/common.json,
apps/web/public/static/locales/iw/common.json,
apps/web/public/static/locales/lv/common.json,
apps/web/public/static/locales/sk/common.json,
apps/web/public/static/locales/ta/common.json, and
apps/web/public/static/locales/th/common.json so that all locale common.json
files include the two keys; after adding, run the parity script to confirm 44/44
for each key.

Comment on lines 2191 to 2193
"least_bookings_scheduled": "Menos reservas programadas",
"most_bookings_completed": "Más reservas completadas",
"least_bookings_completed": "Menos reservas completadas",
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

LGTM — analytics labels

New insights labels read well. Please ensure parity across locales to avoid EN fallbacks.


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
base="apps/web/public/static/locales"
keys=(most_bookings_scheduled least_bookings_scheduled most_bookings_completed least_bookings_completed)
all=$(find "$base" -maxdepth 1 -mindepth 1 -type d | wc -l | tr -d ' ')
for k in "${keys[@]}"; do
  have=$(rg -l "\"$k\"" "$base"/*/common.json | wc -l | tr -d ' ')
  printf "%s -> %s/%s\n" "$k" "$have" "$all"
  if [ "$have" -ne "$all" ]; then rg -L "\"$k\"" "$base"/*/common.json || true; fi
done

Length of output: 33446


The next step is to pinpoint exactly which locale folders are missing each of the new keys. Running the script below will list, for each key, the locales that lack its translation:


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

base="apps/web/public/static/locales"
keys=(most_bookings_scheduled least_bookings_scheduled most_bookings_completed least_bookings_completed)

for k in "${keys[@]}"; do
  echo "Missing translations for \"$k\":"
  for dir in "$base"/*/; do
    locale=$(basename "$dir")
    file="$dir/common.json"
    if [ -f "$file" ] && ! grep -q "\"$k\"" "$file"; then
      echo "  - $locale"
    fi
  done
  echo
done

Length of output: 51432


To get a clear list of exactly which locales still need each of these four keys, let’s run a simplified sweep that prints missing locales per key:

#!/usr/bin/env bash
set -euo pipefail

base="apps/web/public/static/locales"
keys=(
  most_bookings_scheduled
  least_bookings_scheduled
  most_bookings_completed
  least_bookings_completed
)

for key in "${keys[@]}"; do
  echo "$key missing in:"
  for dir in "$base"/*/; do
    locale=$(basename "$dir")
    file="$dir/common.json"
    # only check existing common.json files
    if [[ -f "$file" ]] && ! grep -q "\"$key\"" "$file"; then
      echo "$locale"
    fi
  done
  echo
done

This will output each key followed by the list of locale codes you need to add translations for.


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

base="apps/web/public/static/locales"
keys=(
  most_bookings_scheduled
  least_bookings_scheduled
  most_bookings_completed
  least_bookings_completed
)

for key in "${keys[@]}"; do
  echo "$key missing in:"
  for dir in "$base"/*/; do
    locale=$(basename "$dir")
    file="$dir/common.json"
    if [[ -f "$file" ]] && ! grep -q "\"$key\"" "$file"; then
      echo "$locale"
    fi
  done
  echo
done

Length of output: 50960


Translations missing in several locales—please add the new booking labels to avoid English fallbacks

The four new keys
• most_bookings_scheduled
• least_bookings_scheduled
• most_bookings_completed
• least_bookings_completed

are present in 37 of 44 locales; they need to be added in the following seven folders:

  • apps/web/public/static/locales/hr/common.json
  • apps/web/public/static/locales/id/common.json
  • apps/web/public/static/locales/iw/common.json
  • apps/web/public/static/locales/lv/common.json
  • apps/web/public/static/locales/sk/common.json
  • apps/web/public/static/locales/ta/common.json
  • apps/web/public/static/locales/th/common.json

Please insert the corresponding translations for each key in those files so that all locales have parity and no UI falls back to English.

🤖 Prompt for AI Agents
Files: apps/web/public/static/locales/hr/common.json,
apps/web/public/static/locales/id/common.json,
apps/web/public/static/locales/iw/common.json,
apps/web/public/static/locales/lv/common.json,
apps/web/public/static/locales/sk/common.json,
apps/web/public/static/locales/ta/common.json,
apps/web/public/static/locales/th/common.json — The four new keys
most_bookings_scheduled, least_bookings_scheduled, most_bookings_completed,
least_bookings_completed are missing; add them to each listed common.json with
the correct localized strings (use the existing translations in es/common.json
as reference for meaning), insert them near the other booking-related keys to
keep ordering consistent, ensure valid JSON (comma placement) and run a quick
linter/parse to confirm no syntax errors.

Comment on lines 3461 to 3489
"webhook_created_at": "La hora del webhook",
"webhook_type": "El slug del tipo de evento",
"webhook_title": "El nombre del tipo de evento",
"webhook_start_time": "La hora de inicio del evento",
"webhook_end_time": "La hora de finalización del evento",
"webhook_description": "La descripción del evento según se describe en la configuración del tipo de evento",
"webhook_location": "Ubicación del evento",
"webhook_uid": "El UID de la reserva",
"webhook_reschedule_uid": "El UID para reprogramar",
"webhook_cancellation_reason": "Motivo de cancelación",
"webhook_rejection_reason": "Motivo del rechazo",
"webhook_organizer_name": "Nombre del organizador",
"webhook_organizer_email": "Correo electrónico del organizador",
"webhook_organizer_timezone": "Zona horaria del organizador (p. ej., 'America/New_York', 'Asia/Kolkata')",
"webhook_organizer_locale": "Configuración regional del organizador (p. ej., 'en', 'fr')",
"webhook_attendee_name": "Nombre del primer asistente",
"webhook_attendee_email": "Correo electrónico del primer asistente",
"webhook_attendee_timezone": "Zona horaria del primer asistente",
"webhook_attendee_locale": "Idioma del primer asistente",
"webhook_team_name": "Nombre del equipo reservado",
"webhook_team_members": "Miembros del equipo reservado",
"webhook_video_call_url": "URL de videollamada para la reunión",
"webhook_hide_variables": "Ocultar variables",
"webhook_show_variable": "Mostrar variables disponibles",
"webhook_event_and_booking": "Evento y reserva",
"webhook_people": "Personas",
"webhook_teams": "Equipos",
"webhook_metadata": "Metadatos",
"stats": "Estadísticas",
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Webhook/analytics: parity + JSON/ICU sanity

Given the breadth of new webhook_* keys, please confirm they exist in all locales and that JSON is valid with no unmatched ICU tokens.


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

base="apps/web/public/static/locales"
keys=(
  webhook_trigger_event webhook_created_at webhook_type webhook_title
  webhook_start_time webhook_end_time webhook_description webhook_location
  webhook_uid webhook_reschedule_uid webhook_cancellation_reason
  webhook_rejection_reason webhook_organizer_name webhook_organizer_email
  webhook_organizer_timezone webhook_organizer_locale
  webhook_attendee_name webhook_attendee_email webhook_attendee_timezone
  webhook_attendee_locale webhook_team_name webhook_team_members
  webhook_video_call_url webhook_hide_variables webhook_show_variable
  webhook_event_and_booking webhook_people webhook_teams webhook_metadata
  stats booking_status my_bookings phone failed_bookings add_group
)

# 1) JSON validity
invalid=()
for f in "$base"/*/common.json; do jq -e . "$f" >/dev/null 2>&1 || invalid+=("$f"); done
if ((${#invalid[@]})); then
  printf "❌ Invalid JSON in:\n%s\n" "${invalid[@]}"; exit 1
fi
echo "✅ JSON valid."

# 2) Per-key parity
all=$(find "$base" -maxdepth 1 -mindepth 1 -type d | wc -l | tr -d ' ')
for k in "${keys[@]}"; do
  have=$(rg -l "\"$k\"" "$base"/*/common.json | wc -l | tr -d ' ')
  printf "%-28s -> %s/%s\n" "$k" "$have" "$all"
  if [ "$have" -ne "$all" ]; then rg -L "\"$k\"" "$base"/*/common.json || true; fi
done

# 3) ICU placeholder/braces sanity
mismatch=0
for f in "$base"/*/common.json; do
  open=$(rg -o '{{' "$f" | wc -l || true)
  close=$(rg -o '}}' "$f" | wc -l || true)
  if [ "$open" -ne "$close" ]; then echo "⚠️  ICU mismatch: $f ($open vs $close)"; mismatch=1; fi
done
exit "$mismatch"

Length of output: 302347


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

base="apps/web/public/static/locales"
keys=(
  webhook_trigger_event webhook_created_at webhook_type webhook_title
  webhook_start_time webhook_end_time webhook_description webhook_location
  webhook_uid webhook_reschedule_uid webhook_cancellation_reason
  webhook_rejection_reason webhook_organizer_name webhook_organizer_email
  webhook_organizer_timezone webhook_organizer_locale
  webhook_attendee_name webhook_attendee_email webhook_attendee_timezone
  webhook_attendee_locale webhook_team_name webhook_team_members
  webhook_video_call_url webhook_hide_variables webhook_show_variable
  webhook_event_and_booking webhook_people webhook_teams webhook_metadata
  stats booking_status my_bookings phone failed_bookings add_group
)

python3 - <<'PY'
import json, os, sys

base = "apps/web/public/static/locales"
keys = [
 "webhook_trigger_event","webhook_created_at","webhook_type","webhook_title",
 "webhook_start_time","webhook_end_time","webhook_description","webhook_location",
 "webhook_uid","webhook_reschedule_uid","webhook_cancellation_reason",
 "webhook_rejection_reason","webhook_organizer_name","webhook_organizer_email",
 "webhook_organizer_timezone","webhook_organizer_locale","webhook_attendee_name",
 "webhook_attendee_email","webhook_attendee_timezone","webhook_attendee_locale",
 "webhook_team_name","webhook_team_members","webhook_video_call_url",
 "webhook_hide_variables","webhook_show_variable","webhook_event_and_booking",
 "webhook_people","webhook_teams","webhook_metadata","stats",
 "booking_status","my_bookings","phone","failed_bookings","add_group"
]

locale_dirs = sorted([d for d in os.listdir(base) if os.path.isdir(os.path.join(base,d))])
total = len(locale_dirs)
print("TOTAL_LOCALES:", total)

invalid = []
per_key_counts = {k:0 for k in keys}
missing_per_locale = {}
icu_mismatch = []

def iter_strings(x):
    if isinstance(x,str):
        yield x
    elif isinstance(x,dict):
        for v in x.values():
            yield from iter_strings(v)
    elif isinstance(x,list):
        for v in x:
            yield from iter_strings(v)

for loc in locale_dirs:
    f = os.path.join(base,loc,"common.json")
    if not os.path.isfile(f):
        invalid.append((loc,"missing file"))
        continue
    try:
        with open(f,"r",encoding="utf-8") as fh:
            data = json.load(fh)
    except Exception as e:
        invalid.append((loc,str(e)))
        continue

    missing = [k for k in keys if k not in data]
    if missing:
        missing_per_locale[loc] = missing
    for k in keys:
        if k in data:
            per_key_counts[k] += 1

    total_open_double = total_close_double = total_open = total_close = 0
    samples_double = []
    samples_single = []
    for s in iter_strings(data):
        od = s.count('{{')
        cd = s.count('}}')
        o = s.count('{')
        c = s.count('}')
        if od or cd:
            samples_double.append((od,cd,s[:200]))
        if o or c:
            samples_single.append((o,c,s[:200]))
        total_open_double += od
        total_close_double += cd
        total_open += o
        total_close += c

    if total_open_double != total_close_double or total_open != total_close:
        icu_mismatch.append({
            "locale": loc,
            "double_open": total_open_double,
            "double_close": total_close_double,
            "single_open": total_open,
            "single_close": total_close,
            "sample_double": samples_double[:5],
            "sample_single": samples_single[:5],
        })

if invalid:
    print("INVALID_JSON_COUNT:", len(invalid))
    for loc,err in invalid:
        print("INVALID:", loc, err)
else:
    print("ALL_JSON_VALID")

print("PER_KEY_COUNTS:")
for k in keys:
    print(k, per_key_counts[k], "/", total)

if missing_per_locale:
    print("LOCALES_MISSING_KEYS_COUNT:", len(missing_per_locale))
    for loc in sorted(missing_per_locale):
        print(loc, missing_per_locale[loc])
else:
    print("ALL_LOCALES_HAVE_KEYS")

if icu_mismatch:
    print("ICU_MISMATCH_COUNT:", len(icu_mismatch))
    for m in icu_mismatch:
        print("MISMATCH:", m["locale"], "double {{:", m["double_open"], "}}:", m["double_close"], "single {:", m["single_open"], "}:", m["single_close"])
        if m["sample_double"]:
            print("  sample_double:")
            for od,cd,s in m["sample_double"][:3]:
                print("   ", od, cd, s)
        if m["sample_single"]:
            print("  sample_single:")
            for o,c,s in m["sample_single"][:3]:
                print("   ", o, c, s)
else:
    print("NO_ICU_MISMATCHES")
PY

Length of output: 8228


Webhook/analytics: missing locale keys + ICU brace mismatches — action required

Summary (very short)

  • JSON validity: ✅ all common.json files parse.
  • Parity: each webhook_* key appears in 37/44 locales (keys added in most locales).
  • Problems found: 7 locales missing the new keys; 3 locales have ICU/brace-count mismatches that can break i18n parsing.

Files/locales needing attention

  • Missing webhook_* keys (add the new keys or confirm intentional omission):
    • apps/web/public/static/locales/hr/common.json
    • apps/web/public/static/locales/id/common.json
    • apps/web/public/static/locales/iw/common.json
    • apps/web/public/static/locales/lv/common.json
    • apps/web/public/static/locales/sk/common.json
    • apps/web/public/static/locales/ta/common.json
    • apps/web/public/static/locales/th/common.json

ICU / brace mismatches (investigate & fix)

  • apps/web/public/static/locales/bn/common.json — double-brace {{: 485 vs }}: 485; single-brace { : 988 vs } : 986
  • apps/web/public/static/locales/nl/common.json — double-brace {{: 491 vs }}: 491; single-brace { : 985 vs } : 986
  • apps/web/public/static/locales/uk/common.json — double-brace {{: 490 vs }}: 491; single-brace { : 984 vs } : 985
    • Likely culprits: translation strings embedding JSON-like fragments / nested placeholders (examples in these files such as $t(day, {"count": {{days}} }) and repeated {{count}} placeholders). Check those strings for unbalanced braces or improper escaping.

Recommended next steps (short)

  • Add the missing webhook_* keys to the 7 locale files (or confirm intentional omission).
  • For bn/nl/uk: search for occurrences of '{{' / '}}' and unmatched single '{'/' }', balance or escape braces, or refactor the string to use safe ICU/placeholders; verify translated strings containing JSON fragments (e.g. $t(..., {"count": {{days}} })).
  • Re-run the JSON/ICU sanity script after fixes.
🤖 Prompt for AI Agents
In apps/web/public/static/locales/es/common.json around lines 3461 to 3489 the
webhook_* keys are present here but the PR review found 7 locales missing these
new webhook_* keys and 3 locales (bn, nl, uk) with ICU/brace-count mismatches;
add the same webhook_* entries to apps/web/public/static/locales/hr/common.json,
id/common.json, iw/common.json, lv/common.json, sk/common.json, ta/common.json,
and th/common.json (or confirm intentional omission), and for
apps/web/public/static/locales/bn/common.json, nl/common.json and uk/common.json
locate strings containing '{{'/'}}' and unmatched '{'/' }' (examples like
$t(..., {"count": {{days}} })), balance or escape double/single braces or
refactor to use proper ICU/placeholders so brace counts match, then re-run the
JSON/ICU sanity script to verify fixes.

"hosts_unavailable_for_booking": "Niektórzy gospodarze są niedostępni do rezerwacji.",
"fixed_hosts_unavailable_for_booking": "Niektórzy przypisani gospodarze są niedostępni do rezerwacji.",
"round_robin_hosts_unavailable_for_booking": "Żaden z gospodarzy Round Robin nie jest dostępny do rezerwacji.",
"round_robin_host_unavailable_for_booking": "Gospodarz Round Robin jest niedostępny do rezerwacji.",
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

RR host key added — verify cross-locale coverage to avoid runtime fallbacks

The singular key looks correct here. Please confirm it exists in all locales and the legacy plural key is fully removed across the repo.

Run this from repo root:


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo '1) Legacy plural key should NOT exist anywhere'
rg -nP '\bround_robin_hosts_unavailable_for_booking\b' apps/web/public/static/locales || true

echo -e '\n2) New singular key SHOULD exist in every locale/common.json'
find apps/web/public/static/locales -type f -name 'common.json' \
  -exec sh -c 'jq -e "has(\"round_robin_host_unavailable_for_booking\")" "{}" >/dev/null || echo "MISSING: {}"' \;

Length of output: 917


Add the new RR host key to all locale files to prevent runtime fallbacks

The legacy plural key round_robin_hosts_unavailable_for_booking has been fully removed, but the new singular key is only present in some locales. Please add "round_robin_host_unavailable_for_booking" to each common.json under apps/web/public/static/locales. The following locales are currently missing it:

• apps/web/public/static/locales/hr/common.json
• apps/web/public/static/locales/id/common.json
• apps/web/public/static/locales/iw/common.json
• apps/web/public/static/locales/lv/common.json
• apps/web/public/static/locales/sk/common.json
• apps/web/public/static/locales/ta/common.json
• apps/web/public/static/locales/th/common.json

Once added, ensure you run the localization tests (or your standard verification) to confirm coverage across all supported languages.

🤖 Prompt for AI Agents
In apps/web/public/static/locales/{hr,id,iw,lv,sk,ta,th}/common.json around
where other round_robin keys live (add at or near line ~123), the new singular
key "round_robin_host_unavailable_for_booking" is missing; add this key to each
of those seven locale files with the correct localized string (or copy the same
phrasing used for the singular key in other locales / use the English fallback
if a translation is not available), ensure valid JSON formatting and no
duplicate keys, update any locale snapshots, and run the localization tests to
verify coverage across all supported languages.

Comment on lines 3460 to 3421
"webhook_trigger_event": "O nome do evento de gatilho (ex., BOOKING_CREATED, BOOKING_CANCELLED)",
"webhook_created_at": "A hora do webhook",
"webhook_type": "O slug do tipo de evento",
"webhook_title": "O nome do tipo de evento",
"webhook_start_time": "A hora de início do evento",
"webhook_end_time": "A hora de fim do evento",
"webhook_description": "A descrição do evento conforme descrito nas configurações do tipo de evento",
"webhook_location": "Localização do evento",
"webhook_uid": "O UID da reserva",
"webhook_reschedule_uid": "O UID para reagendamento",
"webhook_cancellation_reason": "Motivo do cancelamento",
"webhook_rejection_reason": "Motivo da rejeição",
"webhook_organizer_name": "Nome do organizador",
"webhook_organizer_email": "Email do organizador",
"webhook_organizer_timezone": "Fuso horário do organizador (ex., 'America/New_York', 'Asia/Kolkata')",
"webhook_organizer_locale": "Idioma do organizador (ex., 'en', 'fr')",
"webhook_attendee_name": "Nome do primeiro participante",
"webhook_attendee_email": "Email do primeiro participante",
"webhook_attendee_timezone": "Fuso horário do primeiro participante",
"webhook_attendee_locale": "Localidade do primeiro participante",
"webhook_team_name": "Nome da equipa reservada",
"webhook_team_members": "Membros da equipa reservada",
"webhook_video_call_url": "URL de videochamada para a reunião",
"webhook_hide_variables": "Ocultar variáveis",
"webhook_show_variable": "Mostrar variáveis disponíveis",
"webhook_event_and_booking": "Evento e reserva",
"webhook_people": "Pessoas",
"webhook_teams": "Equipas",
"webhook_metadata": "Metadados",
"stats": "Estatísticas",
"booking_status": "Status da reserva",
"location_custom_label_input_label": "Etiqueta personalizada na página de reserva",
"meeting_link": "Link da reunião",
"my_bookings": "As minhas reservas",
"phone": "Telefone",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Quick sweep for residual pt‑BR tokens in changed hunks (optional)

Run this script to confirm no “equipe(s)”, “gerenciar/gerenciamento”, “roteamento”, “Status”, “Link”, “aplicativo”, “você”, “Visualizar”, “Excluir”, or “término” remain in the edited ranges after applying the diffs above.

Also applies to: 358-361, 371-372, 876-879, 951-952, 1002-1002, 1027-1027, 1243-1243, 1529-1531, 1586-1589, 1611-1613, 1851-1852, 2191-2193, 2267-2268, 2937-2941, 3004-3005, 3308-3375, 3382-3382, 3400-3400, 3432-3441


🏁 Script executed:

#!/bin/bash
file="apps/web/public/static/locales/pt/common.json"
# Only the changed ranges we commented on
ranges=(
  "120-130" "350-374" "870-885" "946-955" "1018-1032" "1238-1246"
  "1526-1532" "1582-1592" "1848-1854" "2190-2194" "2259-2269"
  "2936-2942" "2998-3008" "3308-3376" "3380-3402" "3430-3445"
  "3460-3495"
)
echo "Scanning changed hunks for pt-BR tokens…"
for r in "${ranges[@]}"; do
  start="${r%-*}"; end="${r#*-}"
  echo -e "\n== ${file}:${start}-${end} =="
  sed -n "${start},${end}p" "$file" \
    | rg -nP '\b(equipe|equipes|gerenciar|gerenciamento|roteamento|Status|Link|aplicativo|você|Visualizar|Excluir|término)\b' || true
done

Length of output: 9487


Remove residual pt-BR tokens and apply pt-PT equivalents

The sweep script has uncovered several remaining Brazilian-Portuguese terms within the edited hunks. Please replace them with the agreed pt-PT vocabulary:

• apps/web/public/static/locales/pt/common.json (lines 350–374)
– “você” → consider “tu” or rephrase to avoid 2nd-person pronoun
– “aplicativo” → “aplicação”

• apps/web/public/static/locales/pt/common.json (lines 1018–1032)
– “aplicativo” → “aplicação”

• apps/web/public/static/locales/pt/common.json (lines 1526–1532)
– “você” → consider “tu” or rephrase

• apps/web/public/static/locales/pt/common.json (lines 1848–1854)
– “gerenciar” → “gerir”

• apps/web/public/static/locales/pt/common.json (lines 2259–2269)
– “roteamento” → “encaminhamento”

• apps/web/public/static/locales/pt/common.json (lines 2936–2942)
– “término” → “fim”

• apps/web/public/static/locales/pt/common.json (lines 2998–3008)
– “Excluir” → “Remover”

• apps/web/public/static/locales/pt/common.json (lines 3308–3376)
– “Visualizar” → “Ver”
– “Excluir” → “Remover”
– “gerenciamento” → “gestão”

• apps/web/public/static/locales/pt/common.json (lines 3430–3445)
– “Status” → “Estado”
– “Excluir” → “Remover”

• apps/web/public/static/locales/pt/common.json (lines 3460–3495)
– “Status” → “Estado”
– “Link” → “Ligação”

After making these adjustments, rerun the sweep script to ensure no pt-BR tokens remain.

🤖 Prompt for AI Agents
In apps/web/public/static/locales/pt/common.json around lines 3460 to 3495 there
are pt-BR terms that need pt-PT equivalents; update occurrences in this region
(and the other referenced ranges when fixing overall file) replacing “Status”
with “Estado” and “Link” with “Ligação” (and across file apply the reviewer’s
list: “você” → rephrase to avoid 2nd-person or use “tu”, “aplicativo” →
“aplicação”, “gerenciar” → “gerir”, “roteamento” → “encaminhamento”, “término” →
“fim”, “Excluir” → “Remover”, “Visualizar” → “Ver”, “gerenciamento” → “gestão”),
ensure strings remain valid JSON and preserve surrounding
punctuation/capitalization, then rerun the sweep script to confirm all pt-BR
tokens are removed.

"hosts_unavailable_for_booking": "Neki od domaćina nisu dostupni za rezervaciju.",
"fixed_hosts_unavailable_for_booking": "Neki od fiksnih domaćina nisu dostupni za rezervaciju.",
"round_robin_hosts_unavailable_for_booking": "Nijedan Round Robin domaćin nije dostupan za rezervaciju.",
"round_robin_host_unavailable_for_booking": "Round Robin domaćin nije dostupan za zakazivanje.",
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Localize “Round Robin” to Serbian

Avoid mixed-language UI. Use the established term “kružno dodeljivanje”.

Apply this diff:

-  "round_robin_host_unavailable_for_booking": "Round Robin domaćin nije dostupan za zakazivanje.",
+  "round_robin_host_unavailable_for_booking": "Domaćin kružnog dodeljivanja nije dostupan za zakazivanje."

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In apps/web/public/static/locales/sr/common.json around line 123, replace the
mixed-language phrase "Round Robin domaćin nije dostupan za zakazivanje." with
the fully localized Serbian term using "kružno dodeljivanje"; update the string
to read "Domaćin za kružno dodeljivanje nije dostupan za zakazivanje." so the UI
uses consistent Serbian terminology.

"pbac_desc_update_roles": "Ažuriranje uloga",
"pbac_desc_delete_roles": "Brisanje uloga",
"pbac_desc_manage_roles": "Sve akcije nad ulogama",
"pbac_desc_manage_roles": "Sve akcije nad ulogama u timovima organizacije",
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Harmonize PBAC scope phrasing to “u organizaciji”

These entries still use team‑scoped wording (“u timovima organizacije”), which conflicts with org‑wide scope elsewhere and with the PR’s intent. Also consider appending scope to workflows for parity.

-  "pbac_desc_manage_roles": "Sve akcije nad ulogama u timovima organizacije",
+  "pbac_desc_manage_roles": "Sve akcije nad ulogama u organizaciji",
-  "pbac_desc_manage_event_types": "Sve akcije na tipovima događaja u timovima organizacije",
+  "pbac_desc_manage_event_types": "Sve akcije nad tipovima događaja u organizaciji",
-  "pbac_desc_manage_bookings": "Sve akcije na rezervacijama u timovima organizacije",
+  "pbac_desc_manage_bookings": "Sve akcije nad rezervacijama u organizaciji",

Optional (for parallelism):

-  "pbac_desc_manage_workflows": "Puni pristup upravljanju svim radnim tokovima",
+  "pbac_desc_manage_workflows": "Puni pristup upravljanju svim radnim tokovima u organizaciji",

Also applies to: 3349-3349, 3372-3372, 3345-3345

🤖 Prompt for AI Agents
In apps/web/public/static/locales/sr/common.json around lines 3339 (and also
update similar entries at 3345, 3349, 3372), the PBAC scope wording uses "u
timovima organizacije" but should be harmonized to "u organizaciji"; update
those string values to replace "u timovima organizacije" with "u organizaciji"
and, where appropriate, append the same scope phrasing to workflow-related
entries for parity so all PBAC descriptions consistently use org-wide wording.

"hosts_unavailable_for_booking": "有些主持人无法预订。",
"fixed_hosts_unavailable_for_booking": "部分固定主持人无法进行预约。",
"round_robin_hosts_unavailable_for_booking": "没有轮流主持人可供预约。",
"round_robin_host_unavailable_for_booking": "轮值主持人当前不可预订。",
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Quick verification script to catch residual English and RR term drift

Run to ensure (1) no “Round Robin/round robin” English remains in zh-CN, (2) RR term consistency (“轮流” vs “轮询”), and (3) webhook_* key parity with en.

Also applies to: 3382-3382, 3460-3491


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

EN="apps/web/public/static/locales/en/common.json"
ZH="apps/web/public/static/locales/zh-CN/common.json"

echo "1) Residual English 'Round Robin' in zh-CN:"
rg -n 'Round Robin|round robin' "$ZH" || echo "✔ No residual 'Round Robin' found"

echo
echo "2) RR term consistency ('轮流' preferred over '轮询'):"
echo "- Counts:"
printf "轮流: "; rg -o '轮流' -N "$ZH" | wc -l || true
printf "轮询: "; rg -o '轮询' -N "$ZH" | wc -l || true
echo "- Lines with '轮询' (review for consistency):"
rg -n '轮询' "$ZH" || true

echo
echo "3) webhook_* key parity (en vs zh-CN):"
jq -r 'keys[] | select(startswith("webhook_"))' "$EN" | sort > /tmp/en_webhook.txt
jq -r 'keys[] | select(startswith("webhook_"))' "$ZH" | sort > /tmp/zh_webhook.txt
diff -u /tmp/en_webhook.txt /tmp/zh_webhook.txt || { echo "❌ webhook_* key mismatch"; exit 1; }
echo "✔ webhook_* keys match between en and zh-CN"

Length of output: 2891


Translation Clean-Up Required: Remove English “round robin” and Enforce Term Consistency

The localization script has surfaced two key issues in apps/web/public/static/locales/zh-CN/common.json:

• Residual English “round robin” remains in several entries (these must be fully translated):
– skip_rr_assignment_label (line 2713)
– reassign_to_another_rr_host (line 2793)
– reassign_round_robin_host (line 2797)
– salesforce_if_free_email_domain_skip_owner_check (line 2985)
– include_no_show_in_rr_calculation (line 3275)
– rr_load_balancing_disabled_with_groups (line 3382)

• Inconsistent Chinese terminology for the RR feature—there are 17 instances of “轮询” versus 13 of “轮流”. The team’s style guide prefers “轮流” for clarity. Please review and replace all “轮询” occurrences with “轮流” (e.g., event_reassigned_subtitle, organization_banner_description, reset_interval_weighted_rr, etc.) to maintain consistency.

The webhook_* key parity check passed—no action needed there.

Please update these translations before merging.

🤖 Prompt for AI Agents
In apps/web/public/static/locales/zh-CN/common.json (scan from the listed key
lines ~2713–3382, include line 123 location for context), several entries still
contain the English phrase "round robin" and there is inconsistent Chinese
terminology ("轮询" vs "轮流"); replace the raw English "round robin" in the listed
keys (skip_rr_assignment_label, reassign_to_another_rr_host,
reassign_round_robin_host, salesforce_if_free_email_domain_skip_owner_check,
include_no_show_in_rr_calculation, rr_load_balancing_disabled_with_groups) with
a full Chinese translation using the project-preferred term "轮流", and globally
search/replace all occurrences of "轮询" to "轮流" (carefully review surrounding
phrases like event_reassigned_subtitle, organization_banner_description,
reset_interval_weighted_rr, etc. to ensure grammar and context remain correct);
after edits run the localization script/linter to verify no missing keys or
formatting errors and commit the updated common.json.

@keithwillcode keithwillcode merged commit a491518 into main Aug 27, 2025
10 of 11 checks passed
@keithwillcode keithwillcode deleted the lingo.dev/main branch August 27, 2025 16:26
@github-actions
Copy link
Contributor

E2E results are ready!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core area: core, team members only foundation i18n area: i18n, translations ready-for-e2e

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants