Add ukranian translation of the main Readme. #2351
Conversation
|
ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR. |
📝 WalkthroughSummary by CodeRabbit
WalkthroughAdds a complete Ukrainian-language README ( ChangesUkrainian Locale Addition
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
ESLint install failed. For unrecoverable errors, disable the tool in CodeRabbit configuration. 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 |
|
| Filename | Overview |
|---|---|
| scripts/lib/install-manifests.js | Adds ua-UA to SUPPORTED_LOCALES and LOCALE_ALIAS_TO_COMPONENT_ID, but the target component locale:ua is missing from install-components.json, making --locale ua-UA throw at install time. |
| docs/ua-UA/README.md | New Ukrainian translation of the main README; relative links verified correct from docs/ua-UA/ depth. |
| README.md | Adds Ukrainian link to the top-level language switcher in both header and centered nav block. |
| docs/de-DE/README.md | Language switcher updated to append Ukrainian link; relative path ../ua-UA/README.md is correct. |
| docs/es/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
| docs/ru/README.md | Language switcher (both header and center nav) updated to append Ukrainian link; paths are correct. |
| docs/th/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
| docs/tr/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
| docs/ur/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
| docs/vi-VN/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
| docs/zh-CN/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
| docs/zh-TW/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
| docs/ja-JP/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
| docs/ko-KR/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
| docs/pt-BR/README.md | Language switcher updated to append Ukrainian link; relative path is correct. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["User: --locale ua-UA"] --> B["request.js: LOCALE_ALIAS_TO_COMPONENT_ID['ua-UA']"]
B --> C["localeComponentId = 'locale:ua'"]
C --> D["includeComponentIds.push('locale:ua')"]
D --> E["expandComponentIdsToModuleIds(['locale:ua'])"]
E --> F{"manifests.componentsById.get('locale:ua')"}
F -->|"undefined — not in install-components.json"| G["throw: Unknown install component: locale:ua"]
F -->|"Expected: entry exists"| H["Resolve modules → install"]
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A["User: --locale ua-UA"] --> B["request.js: LOCALE_ALIAS_TO_COMPONENT_ID['ua-UA']"]
B --> C["localeComponentId = 'locale:ua'"]
C --> D["includeComponentIds.push('locale:ua')"]
D --> E["expandComponentIdsToModuleIds(['locale:ua'])"]
E --> F{"manifests.componentsById.get('locale:ua')"}
F -->|"undefined — not in install-components.json"| G["throw: Unknown install component: locale:ua"]
F -->|"Expected: entry exists"| H["Resolve modules → install"]
Reviews (1): Last reviewed commit: "docs(ua):" | Re-trigger Greptile
| 'zh-TW': 'locale:zh-tw', | ||
| 'de-DE': 'locale:de-de', | ||
| 'de': 'locale:de-de', | ||
| 'ua-UA': 'locale:ua' |
There was a problem hiding this comment.
Missing
locale:ua component in install-components.json
LOCALE_ALIAS_TO_COMPONENT_ID maps 'ua-UA' to 'locale:ua', but manifests/install-components.json has no locale:ua entry — it ends at locale:de-de. When a user runs --locale ua-UA, request.js (line 112) pushes 'locale:ua' into includeComponentIds, then expandComponentIdsToModuleIds calls manifests.componentsById.get('locale:ua') which returns undefined, and the install throws Unknown install component: locale:ua. A corresponding entry (mirroring the pattern of locale:de-de) needs to be added to install-components.json before this locale is usable.
| 'de-DE': 'locale:de-de', | ||
| 'de': 'locale:de-de', | ||
| 'ua-UA': 'locale:ua' | ||
| }); |
There was a problem hiding this comment.
All other locales that have a full
lang-COUNTRY form also provide a short lang alias (e.g., 'de' for de-DE, 'vi' for vi-VN). The Ukrainian entry only registers the long form, so users who pass --locale ua (without the country code) will get an "Unsupported locale" error instead of resolving to the same component.
| 'de-DE': 'locale:de-de', | |
| 'de': 'locale:de-de', | |
| 'ua-UA': 'locale:ua' | |
| }); | |
| 'de-DE': 'locale:de-de', | |
| 'de': 'locale:de-de', | |
| 'ua-UA': 'locale:ua', | |
| 'ua': 'locale:ua', | |
| }); |
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
scripts/lib/install-manifests.js (1)
18-35: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winAdd the short Ukrainian alias to avoid CLI locale resolution failures.
Line 34 adds
ua-UA, but unlike other regioned locales (de-DE/de,ja-JP/ja),uais missing. Inscripts/lib/install/request.js, this makes--locale uafail as unsupported even though the target component islocale:ua.Suggested fix
const LOCALE_ALIAS_TO_COMPONENT_ID = Object.freeze({ @@ 'de-DE': 'locale:de-de', 'de': 'locale:de-de', - 'ua-UA': 'locale:ua' + 'ua-UA': 'locale:ua', + 'ua': 'locale:ua' });🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/lib/install-manifests.js` around lines 18 - 35, The locale alias map in LOCALE_ALIAS_TO_COMPONENT_ID is missing the short Ukrainian alias, which causes locale resolution to reject --locale ua even though it should map to locale:ua. Update the alias table in install-manifests.js to include the ua entry alongside ua-UA, and ensure the request handling in request.js resolves both forms through the same component id without changing other locale mappings.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@scripts/lib/install-manifests.js`:
- Around line 18-35: The locale alias map in LOCALE_ALIAS_TO_COMPONENT_ID is
missing the short Ukrainian alias, which causes locale resolution to reject
--locale ua even though it should map to locale:ua. Update the alias table in
install-manifests.js to include the ua entry alongside ua-UA, and ensure the
request handling in request.js resolves both forms through the same component id
without changing other locale mappings.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: e478a601-2acc-4690-8c8b-f19d497a1326
📒 Files selected for processing (15)
README.mddocs/de-DE/README.mddocs/es/README.mddocs/ja-JP/README.mddocs/ko-KR/README.mddocs/pt-BR/README.mddocs/ru/README.mddocs/th/README.mddocs/tr/README.mddocs/ua-UA/README.mddocs/ur/README.mddocs/vi-VN/README.mddocs/zh-CN/README.mddocs/zh-TW/README.mdscripts/lib/install-manifests.js
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
- GitHub Check: Greptile Review
🧰 Additional context used
📓 Path-based instructions (23)
docs/es/**/*.md
📄 CodeRabbit inference engine (docs/es/CLAUDE.md)
Use lowercase filenames with hyphens for naming convention (e.g.,
python-reviewer.md,tdd-workflow.md) for agents, skills, commands, and documentation files
Files:
docs/es/README.md
docs/es/**/README.md
📄 CodeRabbit inference engine (docs/es/CLAUDE.md)
Use the
/readmeskill when working on the README.md file
Files:
docs/es/README.md
**/*.{js,ts,jsx,tsx,py,java,cs,go,rb,php,scala,kt}
📄 CodeRabbit inference engine (.cursor/rules/common-coding-style.md)
**/*.{js,ts,jsx,tsx,py,java,cs,go,rb,php,scala,kt}: Always create new objects, never mutate existing ones. Use immutable patterns to prevent hidden side effects and enable safe concurrency
Organize code into many small files (200-400 lines typical, 800 lines max) organized by feature/domain rather than by type
Always handle errors explicitly at every level and never silently swallow errors
Always validate all user input before processing at system boundaries
Use schema-based validation where available
Fail fast with clear error messages when validation fails
Never trust external data (API responses, user input, file content)
Ensure code is readable and well-named
Keep functions small (less than 50 lines)
Keep files focused (less than 800 lines)
Avoid deep nesting (more than 4 levels)
Do not use hardcoded values; use constants or configuration instead
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,jsx,tsx,py,java,cs,rb,go,php,swift,kt,rs,c,cpp,h,hpp}
📄 CodeRabbit inference engine (.cursor/rules/common-security.md)
No hardcoded secrets (API keys, passwords, tokens) - validate before any commit
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,jsx,tsx,py,java,cs,rb,go,php}
📄 CodeRabbit inference engine (.cursor/rules/common-security.md)
**/*.{js,ts,jsx,tsx,py,java,cs,rb,go,php}: All user inputs must be validated
Enable CSRF protection on all state-changing endpoints
Verify authentication and authorization for all protected endpoints
Implement rate limiting on all endpoints to prevent abuse
Ensure error messages do not leak sensitive data in responses
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,jsx,tsx,py,java,cs,rb,go,php,sql}
📄 CodeRabbit inference engine (.cursor/rules/common-security.md)
Use parameterized queries to prevent SQL injection
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,jsx,tsx,html,php,java,cs,rb,go}
📄 CodeRabbit inference engine (.cursor/rules/common-security.md)
Implement XSS prevention by sanitizing HTML output
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,jsx,tsx,py,java,cs,rb,go,php,swift,kt,rs,c,cpp,h,hpp,properties,yml,yaml,json,env,config}
📄 CodeRabbit inference engine (.cursor/rules/common-security.md)
NEVER hardcode secrets in source code - ALWAYS use environment variables or a secret manager
Files:
scripts/lib/install-manifests.js
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (.cursor/rules/typescript-coding-style.md)
**/*.{ts,tsx,js,jsx}: Use spread operator for immutable updates in TypeScript/JavaScript instead of direct mutation
Use async/await with try-catch for error handling in TypeScript/JavaScript
Use Zod for schema-based input validation in TypeScript/JavaScript
No console.log statements in production code; use proper logging libraries instead
**/*.{ts,tsx,js,jsx}: Auto-format JavaScript/TypeScript files using Prettier after edit
Warn aboutconsole.logstatements in edited files
Check all modified files forconsole.logstatements before session ends
**/*.{ts,tsx,js,jsx}: Use the ApiResponse interface pattern with generic type parameter:interface ApiResponse<T> { success: boolean; data?: T; error?: string; meta?: { total: number; page: number; limit: number; } }
Implement custom React hooks following the pattern: export a named function with use prefix, generic type parameters, and proper useEffect cleanup for side effects
**/*.{ts,tsx,js,jsx}: Never hardcode secrets; always use environment variables for sensitive credentials like API keys
Throw an error when required environment variables are not configured to fail fast and ensure security prerequisites are metUse Playwright as the E2E testing framework for critical user flows in TypeScript/JavaScript
Files:
scripts/lib/install-manifests.js
{package.json,*.config.js,scripts/**/*.js}
📄 CodeRabbit inference engine (CLAUDE.md)
Package manager detection should support npm, pnpm, yarn, and bun, with configuration via CLAUDE_PACKAGE_MANAGER environment variable or project config.
Files:
scripts/lib/install-manifests.js
scripts/**/*.js
📄 CodeRabbit inference engine (CLAUDE.md)
Ensure cross-platform support for Windows, macOS, and Linux via Node.js scripts in the scripts/ directory.
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,jsx,tsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
**/*.{js,ts,jsx,tsx}: Always create new objects and never mutate in place; return new copies instead
Keep files between 200–400 lines typical, with a maximum of 800 lines
Extract helpers when a file exceeds 200 lines
Handle errors explicitly at every level; never swallow errors silently
Validate all user input before processing; use schema-based validation where available
Never trust external data (API responses, file content, query params); always validate
All user inputs must be validated and sanitized
Error messages must be scrubbed of sensitive internals
Use readable, well-named identifiers in all code
Keep functions under 50 lines
Keep files under 800 lines
Avoid nesting deeper than 4 levels
Implement comprehensive error handling in all code
Do not hardcode values; use constants or environment configuration instead
Do not use in-place mutation; always return new objects or state
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,jsx,tsx,json,env*}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Do not hardcode secrets, API keys, passwords, or tokens
Files:
scripts/lib/install-manifests.js
**/*.{js,ts}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
**/*.{js,ts}: Use parameterized queries for all database writes (no string interpolation)
Auth/authz must be checked server-side for every sensitive path
Rate limiting must be applied to all public endpoints
Files:
scripts/lib/install-manifests.js
**/*.{jsx,tsx,js,ts}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
HTML output must be sanitized where applicable
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,env*}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Required environment variables must be validated at startup
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,jsx,tsx,py,java,go,rs,kt,cpp,c,fs}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{js,ts,jsx,tsx,py,java,go,rs,kt,cpp,c,fs}: Write tests before implementation using TDD workflow: write failing test (RED), implement minimal code (GREEN), then refactor (IMPROVE)
Keep functions small (<50 lines) and files focused (<800 lines, typical 200-400 lines)
Avoid deep nesting (>4 levels)
Files:
scripts/lib/install-manifests.js
**/*.{js,ts,jsx,tsx,py,java,go,rs,kt}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{js,ts,jsx,tsx,py,java,go,rs,kt}: Never mutate existing objects; always create new objects with changes applied (Immutability requirement)
Handle errors at every level; provide user-friendly messages in UI code and detailed context in server-side logs
Ensure error messages don't leak sensitive data
Files:
scripts/lib/install-manifests.js
**/*.{jsx,tsx,html,js,ts}
📄 CodeRabbit inference engine (AGENTS.md)
Sanitize HTML output to prevent XSS vulnerabilities
Files:
scripts/lib/install-manifests.js
{scripts,bin}/**
⚙️ CodeRabbit configuration file
{scripts,bin}/**: Focus on command injection, unsafe subprocess usage, path traversal, SSRF, secret exposure, and missing tests for new CLI behavior.
Files:
scripts/lib/install-manifests.js
README.md
📄 CodeRabbit inference engine (CLAUDE.md)
When working on README.md files, use the
/readmeskill.
Files:
README.md
docs/ja-JP/**/*.{md,json}
📄 CodeRabbit inference engine (docs/ja-JP/CLAUDE.md)
Use lowercase hyphen-separated naming convention for files (e.g.,
python-reviewer.md,tdd-workflow.md)
Files:
docs/ja-JP/README.md
docs/ja-JP/**/README.md
📄 CodeRabbit inference engine (docs/ja-JP/CLAUDE.md)
Use
/readmeskill when working with README.md file
Files:
docs/ja-JP/README.md
🪛 LanguageTool
docs/ua-UA/README.md
[grammar] ~330-~330: Ensure spelling is correct
Context: ... всі директорії правил, якщо ви явно не хочете весь цей контекст у Claude. > > Викорис...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
[grammar] ~750-~750: Ensure spelling is correct
Context: ...ння цього репозиторію — встановлення як плагін Claude Code: ```bash # Додати цей репо...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
[uncategorized] ~1161-~1161: The official name of this software platform is spelled with a capital “H”.
Context: ...-----|---------| | Основні інструкції | .github/copilot-instructions.md | Завжди заван...
(GITHUB)
[uncategorized] ~1163-~1163: The official name of this software platform is spelled with a capital “H”.
Context: ...ля конкретних завдань | | Промпт plan | .github/prompts/plan.prompt.md | Поетапне план...
(GITHUB)
[uncategorized] ~1164-~1164: The official name of this software platform is spelled with a capital “H”.
Context: ... планування реалізації | | Промпт TDD | .github/prompts/tdd.prompt.md | Цикл Червоний-...
(GITHUB)
[uncategorized] ~1165-~1165: The official name of this software platform is spelled with a capital “H”.
Context: ...кращення | | Промпт перевірки безпеки | .github/prompts/security-review.prompt.md | Гл...
(GITHUB)
[uncategorized] ~1166-~1166: The official name of this software platform is spelled with a capital “H”.
Context: ...OWASP | | Промпт виправлення збирання | .github/prompts/build-fix.prompt.md | Системат...
(GITHUB)
[uncategorized] ~1167-~1167: The official name of this software platform is spelled with a capital “H”.
Context: ...илок збирання | | Промпт рефакторингу | .github/prompts/refactor.prompt.md | Очищення ...
(GITHUB)
[uncategorized] ~1192-~1192: The official name of this software platform is spelled with a capital “H”.
Context: ... OpenCode — GitHub Copilot використовує .github/copilot-instructions.md) - **Патерн DR...
(GITHUB)
🔇 Additional comments (14)
docs/ua-UA/README.md (1)
1-1324: LGTM!README.md (1)
1-1: LGTM!Also applies to: 37-37
docs/de-DE/README.md (1)
1-1: LGTM!docs/es/README.md (1)
1-1: LGTM!docs/ja-JP/README.md (1)
1-1: LGTM!Also applies to: 24-24
docs/zh-CN/README.md (1)
1-1: LGTM!Also applies to: 28-28
docs/zh-TW/README.md (1)
16-16: LGTM!docs/ko-KR/README.md (1)
1-1: LGTM!Also applies to: 27-27
docs/pt-BR/README.md (1)
1-1: LGTM!Also applies to: 27-27
docs/ru/README.md (1)
1-1: LGTM!Also applies to: 30-30
docs/th/README.md (1)
1-1: LGTM!Also applies to: 21-21
docs/tr/README.md (1)
26-26: LGTM!docs/ur/README.md (1)
1-1: LGTM!Also applies to: 30-30
docs/vi-VN/README.md (1)
1-1: LGTM!Also applies to: 21-21
What Changed
Added a ukrainian version of the main readme.
Why This Change
It will help ukrainians to better understand ECC.
Testing Done
node tests/run-all.js)Type of Change
fix:Bug fixfeat:New featurerefactor:Code refactoringdocs:Documentationtest:Testschore:Maintenance/toolingci:CI/CD changesSecurity & Quality Checklist
Documentation