Remove unused translation keys#1500
Conversation
📝 WalkthroughWalkthroughRemoved many translation keys across multiple locale files and added new admin/RBAC/onboarding/manifest-related keys; value-casing adjustments applied in some entries. No executable logic changed; only localization JSONs were edited. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. 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. Comment |
There was a problem hiding this comment.
Pull request overview
This pull request removes unused translation keys across all locale JSON files (English, Spanish, Portuguese, Chinese, Indonesian, and German).
Changes:
- Removal of approximately 200+ unused translation keys from each locale file
- All locale files have identical keys removed, maintaining consistency
- No code changes, only translation file cleanup
Reviewed changes
Copilot reviewed 15 out of 15 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| messages/en.json | Removed ~200 unused English translation keys |
| messages/es.json | Removed ~200 unused Spanish translation keys |
| messages/pt-br.json | Removed ~200 unused Portuguese translation keys |
| messages/zh-cn.json | Removed ~200 unused Chinese translation keys |
| messages/id.json | Removed ~200 unused Indonesian translation keys |
| messages/de.json | Removed ~200 unused German translation keys |
4a2d1d2 to
669d878
Compare
|
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 Fix all issues with AI agents
In `@messages/de.json`:
- Around line 1362-1373: German locale file messages/de.json is missing several
RBAC labels present in messages/en.json; add the missing keys: groups,
principal, principal-type, scope, granted-at, assign-role, select-user,
select-group, assign-app-role, and error-role-already-assigned to
messages/de.json with appropriate German translations (or temporary Germanized
placeholders) so the UI doesn't fall back to English; locate the object
alongside existing role keys like "role-app-admin" / "role-org-member" and
insert the new key/value pairs following the same JSON string format to keep
consistency.
In `@messages/en.json`:
- Line 414: The "create" localization key currently uses Title Case ("Create")
which conflicts with nearby generic action labels like "cancel" and "confirm"
that are lowercase; update the value of the "create" key to lowercase ("create")
to match the established casing convention and scan nearby action keys (e.g.,
"cancel", "confirm") to ensure consistency across action-labels.
In `@messages/ja.json`:
- Line 1005: The "plugins" label in messages/ja.json is currently "Plugins"
(English); either translate it to Japanese for consistency (e.g., change the
value for the "plugins" key to "プラグイン") or explicitly confirm that English
branding is intentional and keep the existing value; update the "plugins" JSON
entry accordingly and ensure other Japanese label entries follow the same
localization approach.
In `@messages/ko.json`:
- Line 1005: The "plugins" label in messages/ko.json is left in English while
other UI labels are localized; update the value for the "plugins" JSON key to
the appropriate Korean translation (e.g., "플러그인") or confirm intentionally kept
as English and add a comment/PR note; modify the "plugins" entry so the
localized string matches surrounding keys and run a quick UI smoke-check to
ensure it displays correctly.
- Around line 430-456: The ko.json is missing 37 locale keys present in en.json
(e.g. app-access-control, assign, assign-app-role, assign-role, day, days,
days-remaining, error-assigning-role, error-fetching-role-bindings,
error-removing-role, error-role-already-assigned, expires-today, granted-at,
group, groups, no-data-available, onboarding-funnel,
onboarding-funnel-description, onboarding-trend, org-name, principal,
principal-type, reason-optional, reason-placeholder, remove, role-assigned,
role-removed, scope, search-role-bindings, select-app-role, select-group,
select-user, trial-end-date, trial-organizations-list, user); add each missing
key to messages/ko.json with appropriate Korean translations following the
existing key naming and interpolation patterns (or add English placeholders if
translation is unavailable), keep token placeholders (e.g. {amount}, {org})
identical to en.json, and ensure JSON formatting/commas match the surrounding
entries so the file remains valid.
In `@messages/tr.json`:
- Line 1005: The "plugins" key in messages/tr.json is left in English while the
rest of the Turkish locale is translated; either provide the proper Turkish
translation (e.g., replace "plugins" value with "Eklentiler" or another approved
Turkish term) or confirm that English branding is intentional and keep it
unchanged; update the "plugins" key value accordingly and ensure it matches the
locale's style and casing consistency.
🧹 Nitpick comments (3)
messages/id.json (1)
1005-1005: Consider translating "Plugins" to Indonesian.The value
"Plugins"is kept in English. While this may be intentional (technical terms are sometimes preserved), verify whether this should be localized for consistency with other Indonesian translations in this file.messages/zh-cn.json (1)
1005-1005: Consider translating "Plugins" to Chinese.Similar to the Indonesian locale,
"Plugins"remains in English. For Chinese users, consider using a localized term like"插件"for consistency, unless there's a specific reason to keep technical terms in English.messages/pl.json (1)
1005-1005: Consider translating "Plugins" to Polish.As with the other locales,
"Plugins"remains in English. For Polish users, consider using"Wtyczki"for consistency, unless technical terms are intentionally kept in English across all locales.
| "zip-bundle": "ZIP-App-Bündel", | ||
| "access": "Zugriff", | ||
| "role-app-admin": "App-Administrator", | ||
| "role-app-developer": "App-Entwickler", | ||
| "role-app-uploader": "App-Uploader", | ||
| "role-app-reader": "App-Betrachter", | ||
| "remove-role": "Rolle entfernen", | ||
| "remove-role-confirm": "Möchten Sie den Zugriff dieses Benutzers auf die App entfernen?", | ||
| "role-org-super-admin": "Super-Admin", | ||
| "role-org-admin": "Administrator", | ||
| "role-org-billing-admin": "Abrechnungsmanager", | ||
| "role-org-member": "Mitglied" |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Compare locale key sets for parity (en as source of truth).
cd /tmp/repo && python - <<'PY'
import json
files = ["messages/en.json", "messages/fr.json", "messages/de.json"]
data = {f: json.load(open(f, encoding="utf-8")) for f in files}
keys = {f: set(v.keys()) for f, v in data.items()}
base = keys["messages/en.json"]
for f, k in keys.items():
missing = sorted(base - k)
extra = sorted(k - base)
print(f"\n{f}")
print(f" missing vs en: {len(missing)}")
if missing:
print(" ", missing[:50])
print(f" extra vs en: {len(extra)}")
if extra:
print(" ", extra[:50])
PYRepository: Cap-go/capgo
Length of output: 142
🏁 Script executed:
# Check if files exist and their sizes
ls -lh messages/en.json messages/fr.json messages/de.json 2>/dev/null
# Search for specific RBAC keys in English locale
echo "=== RBAC keys in en.json ==="
rg '(groups|principal|principal-type|scope|granted-at|assign-role|select-user|select-group|assign-app-role)' messages/en.json
# Search for the same keys in German locale
echo -e "\n=== RBAC keys in de.json ==="
rg '(groups|principal|principal-type|scope|granted-at|assign-role|select-user|select-group|assign-app-role)' messages/de.jsonRepository: Cap-go/capgo
Length of output: 1608
🏁 Script executed:
# Search for each specific RBAC key individually in de.json
echo "Checking for specific RBAC keys in de.json:"
for key in "groups" "principal" "principal-type" "scope" "granted-at" "assign-role" "select-user" "select-group" "assign-app-role" "error-role-already-assigned"; do
count=$(rg "\"$key\"" messages/de.json | wc -l)
echo " '$key': found=$count"
done
echo -e "\nSame check in en.json for comparison:"
for key in "groups" "principal" "principal-type" "scope" "granted-at" "assign-role" "select-user" "select-group" "assign-app-role" "error-role-already-assigned"; do
count=$(rg "\"$key\"" messages/en.json | wc -l)
echo " '$key': found=$count"
doneRepository: Cap-go/capgo
Length of output: 658
German locale is missing new RBAC labels.
The following RBAC keys are present in messages/en.json but absent from messages/de.json: groups, principal, principal-type, scope, granted-at, assign-role, select-user, select-group, assign-app-role, and error-role-already-assigned. The UI will fall back or display missing text for these labels in the German locale.
🤖 Prompt for AI Agents
In `@messages/de.json` around lines 1362 - 1373, German locale file
messages/de.json is missing several RBAC labels present in messages/en.json; add
the missing keys: groups, principal, principal-type, scope, granted-at,
assign-role, select-user, select-group, assign-app-role, and
error-role-already-assigned to messages/de.json with appropriate German
translations (or temporary Germanized placeholders) so the UI doesn't fall back
to English; locate the object alongside existing role keys like "role-app-admin"
/ "role-org-member" and insert the new key/value pairs following the same JSON
string format to keep consistency.
| "credit-transaction-refund": "Refund", | ||
| "credit-transaction-type": "Type", | ||
| "create": "create", | ||
| "create": "Create", |
There was a problem hiding this comment.
Check action-label casing consistency.
create is now Title Case while nearby generic actions like cancel/confirm are lowercase. If these appear together in the UI, the mixed casing can look inconsistent. Consider aligning with the chosen convention.
✏️ Optional tweak to match the existing lowercase action labels
- "create": "Create",
+ "create": "create",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "create": "Create", | |
| "create": "create", |
🤖 Prompt for AI Agents
In `@messages/en.json` at line 414, The "create" localization key currently uses
Title Case ("Create") which conflicts with nearby generic action labels like
"cancel" and "confirm" that are lowercase; update the value of the "create" key
to lowercase ("create") to match the established casing convention and scan
nearby action keys (e.g., "cancel", "confirm") to ensure consistency across
action-labels.
| "other-orgs-with-apps": "あなたがアプリを持つ他の組織の管理者です", | ||
| "overriding-default-channel": "デフォルトチャンネルを上書き", | ||
| "overview": "概要", | ||
| "plugins": "Plugins", |
There was a problem hiding this comment.
Translate plugins label or confirm English branding.
Japanese UI typically localizes this term; consider using Katakana for consistency unless English is intentional.
✏️ Suggested translation
- "plugins": "Plugins",
+ "plugins": "プラグイン",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "plugins": "Plugins", | |
| "plugins": "プラグイン", |
🤖 Prompt for AI Agents
In `@messages/ja.json` at line 1005, The "plugins" label in messages/ja.json is
currently "Plugins" (English); either translate it to Japanese for consistency
(e.g., change the value for the "plugins" key to "プラグイン") or explicitly confirm
that English branding is intentional and keep the existing value; update the
"plugins" JSON entry accordingly and ensure other Japanese label entries follow
the same localization approach.
| "admin-credits": "관리자 크레딧", | ||
| "admin-credits-title": "크레딧 부여", | ||
| "admin-credits-description": "고객 조직에 크레딧을 부여합니다. 모든 부여는 관리자 사용자 ID와 함께 기록됩니다.", | ||
| "admin-credits-grant-title": "조직에 크레딧 부여", | ||
| "admin-credits-select-org": "조직 선택", | ||
| "admin-credits-search-placeholder": "이름, 이메일 또는 조직 ID로 검색...", | ||
| "admin-credits-current-balance": "현재 잔액", | ||
| "admin-credits-no-balance": "아직 크레딧이 없습니다", | ||
| "admin-credits-expires": "다음 만료일", | ||
| "admin-credits-amount-label": "크레딧 금액", | ||
| "admin-credits-amount-required": "유효한 크레딧 금액을 입력하세요", | ||
| "admin-credits-expires-months": "만료 기간 (개월)", | ||
| "admin-credits-notes-label": "메모 (선택사항)", | ||
| "admin-credits-notes-placeholder": "크레딧 부여 사유...", | ||
| "admin-credits-grant-button": "{amount} 크레딧 부여", | ||
| "admin-credits-grant-success": "{org}에 {amount} 크레딧을 성공적으로 부여했습니다", | ||
| "admin-credits-grant-error": "크레딧 부여에 실패했습니다. 다시 시도해 주세요.", | ||
| "admin-credits-search-error": "조직 검색에 실패했습니다. 다시 시도해 주세요.", | ||
| "admin-credits-balance-error": "크레딧 잔액 로드에 실패했습니다. 다시 시도해 주세요.", | ||
| "admin-credits-grants-load-error": "부여 기록 로드에 실패했습니다. 다시 시도해 주세요.", | ||
| "admin-credits-recent-grants": "최근 관리자 부여", | ||
| "admin-credits-no-grants": "아직 관리자 부여가 없습니다", | ||
| "admin-credits-col-org": "조직", | ||
| "admin-credits-col-amount": "금액", | ||
| "admin-credits-col-notes": "메모", | ||
| "admin-credits-col-date": "부여일", | ||
| "admin-credits-col-expires": "만료일", |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
python - <<'PY'
import json, glob, sys
files = sorted(glob.glob("messages/*.json"))
if not files:
raise SystemExit("No locale files found under messages/")
base = "messages/en.json" if "messages/en.json" in files else files[0]
with open(base, encoding="utf-8") as f:
base_keys = set(json.load(f).keys())
for path in files:
with open(path, encoding="utf-8") as f:
keys = set(json.load(f).keys())
missing = sorted(base_keys - keys)
extra = sorted(keys - base_keys)
if missing or extra:
print(f"\n{path}")
if missing:
print(" missing:", ", ".join(missing[:20]) + (" ..." if len(missing) > 20 else ""))
if extra:
print(" extra:", ", ".join(extra[:20]) + (" ..." if len(extra) > 20 else ""))
PYRepository: Cap-go/capgo
Length of output: 142
🏁 Script executed:
#!/bin/bash
# First, check what locale files exist and their sizes
ls -lh messages/*.json | head -20
echo "---"
# Count total JSON files
find messages -maxdepth 1 -name "*.json" -type f | wc -lRepository: Cap-go/capgo
Length of output: 1058
🏁 Script executed:
#!/bin/bash
# Check number of keys in each locale file using jq
echo "Key counts per locale file:"
for file in messages/*.json; do
count=$(jq 'keys | length' "$file" 2>/dev/null || echo "ERROR")
printf "%-25s %s\n" "$(basename "$file")" "$count"
doneRepository: Cap-go/capgo
Length of output: 548
🏁 Script executed:
#!/bin/bash
# Compare ko.json against en.json to find missing keys
echo "Keys in en.json but missing from ko.json:"
jq -r 'keys[]' messages/en.json | sort > /tmp/en_keys.txt
jq -r 'keys[]' messages/ko.json | sort > /tmp/ko_keys.txt
comm -23 /tmp/en_keys.txt /tmp/ko_keys.txt | head -40
echo "---"
echo "Total missing from ko.json:"
comm -23 /tmp/en_keys.txt /tmp/ko_keys.txt | wc -lRepository: Cap-go/capgo
Length of output: 690
🏁 Script executed:
#!/bin/bash
# Check which keys are missing from de.json (another 1372-key file)
echo "Keys in en.json but missing from de.json:"
jq -r 'keys[]' messages/de.json | sort > /tmp/de_keys.txt
comm -23 /tmp/en_keys.txt /tmp/de_keys.txt | wc -l
comm -23 /tmp/en_keys.txt /tmp/de_keys.txt | head -20Repository: Cap-go/capgo
Length of output: 425
Add missing locale keys to ko.json and 12 other locale files.
Locale key parity check confirms a significant gap: ko.json, de.json, es.json, hi.json, id.json, it.json, ja.json, pl.json, pt-br.json, ru.json, tr.json, vi.json, and zh-cn.json are each missing 37 keys present in en.json. The missing keys include critical feature translations: app-access-control, assign, assign-app-role, assign-role, day, days, days-remaining, error-assigning-role, error-fetching-role-bindings, error-removing-role, error-role-already-assigned, expires-today, granted-at, group, groups, no-data-available, onboarding-funnel, onboarding-funnel-description, onboarding-trend, org-name, principal, principal-type, reason-optional, reason-placeholder, remove, role-assigned, role-removed, scope, search-role-bindings, select-app-role, select-group, select-user, trial-end-date, trial-organizations-list, and user. These cover access control, role management, and onboarding features. All 13 affected locales must be synchronized with en.json before release.
🤖 Prompt for AI Agents
In `@messages/ko.json` around lines 430 - 456, The ko.json is missing 37 locale
keys present in en.json (e.g. app-access-control, assign, assign-app-role,
assign-role, day, days, days-remaining, error-assigning-role,
error-fetching-role-bindings, error-removing-role, error-role-already-assigned,
expires-today, granted-at, group, groups, no-data-available, onboarding-funnel,
onboarding-funnel-description, onboarding-trend, org-name, principal,
principal-type, reason-optional, reason-placeholder, remove, role-assigned,
role-removed, scope, search-role-bindings, select-app-role, select-group,
select-user, trial-end-date, trial-organizations-list, user); add each missing
key to messages/ko.json with appropriate Korean translations following the
existing key naming and interpolation patterns (or add English placeholders if
translation is unavailable), keep token placeholders (e.g. {amount}, {org})
identical to en.json, and ensure JSON formatting/commas match the surrounding
entries so the file remains valid.
| "other-orgs-with-apps": "앱이 있는 다른 조직의 관리자입니다", | ||
| "overriding-default-channel": "기본 채널 재정의", | ||
| "overview": "개요", | ||
| "plugins": "Plugins", |
There was a problem hiding this comment.
Translate plugins label or confirm English branding.
This remains in English while surrounding UI labels are localized; consider translating to Korean for consistency unless the product explicitly keeps the English term.
✏️ Suggested translation
- "plugins": "Plugins",
+ "plugins": "플러그인",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "plugins": "Plugins", | |
| "plugins": "플러그인", |
🤖 Prompt for AI Agents
In `@messages/ko.json` at line 1005, The "plugins" label in messages/ko.json is
left in English while other UI labels are localized; update the value for the
"plugins" JSON key to the appropriate Korean translation (e.g., "플러그인") or
confirm intentionally kept as English and add a comment/PR note; modify the
"plugins" entry so the localized string matches surrounding keys and run a quick
UI smoke-check to ensure it displays correctly.
| "other-orgs-with-apps": "Uygulaması olan bu diğer organizasyonların yöneticisisiniz", | ||
| "overriding-default-channel": "Varsayılan kanalı geçersiz kılıyor", | ||
| "overview": "Genel Bakış", | ||
| "plugins": "Plugins", |
There was a problem hiding this comment.
Translate plugins label or confirm English branding.
This looks untranslated relative to the rest of the Turkish locale.
✏️ Suggested translation
- "plugins": "Plugins",
+ "plugins": "Eklentiler",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "plugins": "Plugins", | |
| "plugins": "Eklentiler", |
🤖 Prompt for AI Agents
In `@messages/tr.json` at line 1005, The "plugins" key in messages/tr.json is left
in English while the rest of the Turkish locale is translated; either provide
the proper Turkish translation (e.g., replace "plugins" value with "Eklentiler"
or another approved Turkish term) or confirm that English branding is
intentional and keep it unchanged; update the "plugins" key value accordingly
and ensure it matches the locale's style and casing consistency.



Summary (AI generated)\n\n- Remove unused translation keys across all locale JSON files.\n\n## Test plan (AI generated)\n\n- Not run (not requested).\n\n## Screenshots (AI generated)\n\n- N/A\n\n## Checklist (AI generated)\n\n- [ ] My code follows the code style of this project and passes\n .\n- [ ] My change requires a change to the documentation.\n- [ ] I have updated the documentation\n accordingly.\n- [ ] My change has adequate E2E test coverage.\n- [ ] I have tested my code manually, and I have provided steps how to reproduce\n my tests\n\nGenerated with AI\n
Summary by CodeRabbit
New Features
Refactor
Style
✏️ Tip: You can customize this high-level summary in your review settings.