i18ntk 1.1.5 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -4
- package/README.md +17 -232
- package/main/i18ntk-init.js +79 -2
- package/main/i18ntk-manage.js +19 -54
- package/main/i18ntk-usage.js +65 -62
- package/package.json +9 -6
- package/ui-locales/de/analyze.json +2 -1
- package/ui-locales/de/init.json +5 -1
- package/ui-locales/de/menu.json +1 -1
- package/ui-locales/en/analyze.json +2 -1
- package/ui-locales/en/common.json +14 -1
- package/ui-locales/en/errors.json +11 -1
- package/ui-locales/en/init.json +5 -1
- package/ui-locales/en/menu.json +9 -1
- package/ui-locales/en/security.json +2 -1
- package/ui-locales/en/status.json +18 -1
- package/ui-locales/es/analyze.json +2 -1
- package/ui-locales/es/init.json +5 -1
- package/ui-locales/es/menu.json +1 -1
- package/ui-locales/fr/analyze.json +2 -1
- package/ui-locales/fr/init.json +5 -1
- package/ui-locales/fr/menu.json +1 -1
- package/ui-locales/ja/analyze.json +2 -1
- package/ui-locales/ja/init.json +5 -1
- package/ui-locales/ja/menu.json +1 -1
- package/ui-locales/ru/analyze.json +7 -6
- package/ui-locales/ru/init.json +5 -1
- package/ui-locales/ru/menu.json +1 -1
- package/ui-locales/zh/analyze.json +2 -1
- package/ui-locales/zh/init.json +5 -1
- package/ui-locales/zh/menu.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,55 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the I18N Management Toolkit are documented here. This project follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
|
|
5
|
-
**Current Version:** 1.1
|
|
5
|
+
**Current Version:** 1.2.1 (2025-08-02) - **DIRECTORY PATH FIXES & CONFIGURATION IMPROVEMENTS** 🎯
|
|
6
|
+
|
|
7
|
+
## [1.2.1] - 2025-08-02
|
|
8
|
+
|
|
9
|
+
### 🎯 Directory Path Configuration Fixes
|
|
10
|
+
- **Fixed**: Scripts now correctly respect directory settings from configuration instead of using hardcoded paths
|
|
11
|
+
- **Enhanced**: Added interactive prompt to detect existing translation directories before creating new ones
|
|
12
|
+
- **Improved**: Users can now specify existing translation file locations during initialization
|
|
13
|
+
- **Fixed**: Prevented creation of redundant `/locales` directories when existing files are already configured
|
|
14
|
+
- **Enhanced**: All scripts now prioritize settings configuration over auto-detection
|
|
15
|
+
|
|
16
|
+
### 🌐 Translation Updates
|
|
17
|
+
- **Added**: New translation keys for directory detection prompts in all supported languages
|
|
18
|
+
- **Enhanced**: English, German, Spanish, French, Russian, Japanese, and Chinese translations for new prompts
|
|
19
|
+
- **Fixed**: Missing `analyze.issueType.same_as_source` translation key across all locale files
|
|
20
|
+
|
|
21
|
+
### 🔧 Configuration Improvements
|
|
22
|
+
- **Enhanced**: `i18ntk-init.js` now detects existing translation directories and prompts users
|
|
23
|
+
- **Fixed**: `i18ntk-usage.js` and `i18ntk-manage.js` now respect settings configuration over auto-detection
|
|
24
|
+
- **Improved**: Settings-based directory configuration takes precedence over hardcoded defaults
|
|
25
|
+
|
|
26
|
+
## [1.2.0] - 2025-08-02
|
|
27
|
+
|
|
28
|
+
### 🧹 Code Cleanup & Simplification
|
|
29
|
+
- **Removed**: UI language switching option (option 10) from main menu to focus on English core functionality
|
|
30
|
+
- **Updated**: Menu numbering adjusted to reflect removal of option 10 (Settings now option 10, Help option 11, Debug option 12)
|
|
31
|
+
- **Simplified**: User interface now defaults to English only for improved stability
|
|
32
|
+
- **Enhanced**: Project organization with centralized reports in `i18ntk-reports/` directory
|
|
33
|
+
- **Enhanced**: Configuration files now organized in `settings/` directory
|
|
34
|
+
|
|
35
|
+
### 🌐 Translation Updates
|
|
36
|
+
- **Added**: "Coming Soon" messages to German, Spanish, French, Russian, Japanese, and Chinese locale files for language switching feature
|
|
37
|
+
- **Status**: All non-English locales updated to indicate language switching will be available in next update
|
|
38
|
+
- **Focus**: English-only interface for v1.2.0 to ensure core functionality stability
|
|
39
|
+
|
|
40
|
+
### 📊 Project Organization
|
|
41
|
+
- **Centralized**: All reports now saved to `i18ntk-reports/` directory for better file management
|
|
42
|
+
- **Organized**: Configuration files moved to `settings/` directory for cleaner project structure
|
|
43
|
+
- **Cleaned**: Removed duplicate configuration files and streamlined project layout
|
|
44
|
+
|
|
45
|
+
### 🔄 Version Updates
|
|
46
|
+
- **Bumped**: Package version to 1.2.0 with breaking change notice for menu option removal
|
|
47
|
+
- **Updated**: All documentation to reflect new project organization and version changes
|
|
48
|
+
- **Enhanced**: Version info with new features and breaking changes documentation
|
|
49
|
+
|
|
50
|
+
### 🛡️ Stability Improvements
|
|
51
|
+
- **Fixed**: Menu option handling after removal of language switching
|
|
52
|
+
- **Enhanced**: Non-interactive mode menu display updated to match new numbering
|
|
53
|
+
- **Improved**: Overall system stability by reducing complexity
|
|
6
54
|
|
|
7
55
|
## [1.1.5] - 2025-08-02
|
|
8
56
|
|
|
@@ -32,7 +80,7 @@ All notable changes to the I18N Management Toolkit are documented here. This pro
|
|
|
32
80
|
|
|
33
81
|
## [1.1.4] - 2025-08-01
|
|
34
82
|
|
|
35
|
-
**⚠️ DEPRECATED:** This version is deprecated. Please upgrade to v1.
|
|
83
|
+
**⚠️ DEPRECATED:** This version is deprecated. Please upgrade to v1.2.0 for critical bug fixes and stability improvements.
|
|
36
84
|
|
|
37
85
|
### 🌍 Core Plugin Functionality - **COMPLETE**
|
|
38
86
|
- **Achieved**: All core functionality now works without issues
|
|
@@ -67,7 +115,7 @@ All notable changes to the I18N Management Toolkit are documented here. This pro
|
|
|
67
115
|
|
|
68
116
|
## [1.1.3] - 2025-07-29
|
|
69
117
|
|
|
70
|
-
**⚠️ DEPRECATED:** This version is deprecated. Please upgrade to v1.
|
|
118
|
+
**⚠️ DEPRECATED:** This version is deprecated. Please upgrade to v1.2.0 for critical bug fixes and stability improvements.
|
|
71
119
|
|
|
72
120
|
### 🌐 Translation System Enhancement
|
|
73
121
|
- **Added**: Translation keys for workflow step names in `autorun.json` files across all supported languages
|
|
@@ -86,7 +134,7 @@ All notable changes to the I18N Management Toolkit are documented here. This pro
|
|
|
86
134
|
|
|
87
135
|
## [1.1.2] - 2025-07-27
|
|
88
136
|
|
|
89
|
-
**⚠️ DEPRECATED:** This version is deprecated. Please upgrade to v1.
|
|
137
|
+
**⚠️ DEPRECATED:** This version is deprecated. Please upgrade to v1.2.0 for critical bug fixes and stability improvements.
|
|
90
138
|
|
|
91
139
|
### 🚀 Enhanced CLI Experience
|
|
92
140
|
- **Improved**: Enabled direct execution of commands (e.g., `i18ntk usage`, `i18ntk workflow`) from the command line, bypassing the interactive menu for specified commands.
|
package/README.md
CHANGED
|
@@ -1,20 +1,29 @@
|
|
|
1
1
|
# i18ntk - Enterprise i18n Management Toolkit
|
|
2
2
|
|
|
3
|
-
**Version:** 1.
|
|
3
|
+
**Version:** 1.2 – **PRODUCTION READY** with enhanced documentation and npm metadata cleanup! 🌍
|
|
4
4
|
|
|
5
|
-
**⚠️ Important Notice:** All previous versions (< 1.
|
|
5
|
+
**⚠️ Important Notice:** All previous versions (< 1.2) are now deprecated due to critical bugs and issues. Please upgrade to v1.1.5 for the most stable experience. We recommend backing up your project before upgrading.
|
|
6
6
|
|
|
7
7
|
**🎉 Thank You:** 200+ downloads in the first week! Thank you for your support and patience as we resolved the functional issues. My First Published Project.
|
|
8
8
|
|
|
9
|
-
[](https://badge.fury.io/js/i18ntk)
|
|
10
|
+
[](https://www.npmjs.com/package/i18ntk)
|
|
10
11
|
[](https://opensource.org/licenses/MIT)
|
|
11
12
|
[](https://nodejs.org/)
|
|
12
13
|
|
|
13
|
-
**i18ntk** (i18n Toolkit) is a comprehensive,
|
|
14
|
+
**i18ntk** (i18n Toolkit) is a comprehensive, internationalization management toolkit for JavaScript/TypeScript projects. It provides a complete CLI suite with multi-language support and advanced analysis capabilities for managing translations efficiently.
|
|
14
15
|
|
|
15
16
|
## ⚠️ Important Disclaimer
|
|
16
17
|
|
|
17
|
-
**This is
|
|
18
|
+
**Important: This is an independent, community-driven toolkit** - not affiliated with any official i18n organization or team. Originally developed as a personal solution for translation management, i18ntk has evolved into a feature-rich internationalization toolkit available to the broader development community. The toolkit is designed to be framework-agnostic and highly adaptable:
|
|
19
|
+
|
|
20
|
+
- Works with any translation file format configured in the settings
|
|
21
|
+
- Operates independently (no i18n framework required)
|
|
22
|
+
- Provides extensive customization options
|
|
23
|
+
- Easily extensible through code modifications or AI-assisted configuration
|
|
24
|
+
- Flexible enough to accommodate diverse project requirements
|
|
25
|
+
|
|
26
|
+
While maintaining its independence, i18ntk strives to follow i18n best practices and standards to ensure compatibility with existing workflows. Although we test thoroughly, we cannot guarantee 100% compatibility with all i18n frameworks or systems. Users are encouraged to test i18ntk with their specific setup and adjust settings as needed or find an alternative solution.
|
|
18
27
|
|
|
19
28
|
## 🚀 Quick Start
|
|
20
29
|
|
|
@@ -135,156 +144,6 @@ npx i18ntk -v # 📋 Show detailed version information (short flag)
|
|
|
135
144
|
- **💾 Backup System**: Automatic configuration backups
|
|
136
145
|
- **⚡ Reliability**: Advanced error handling and graceful degradation for non-interactive environments
|
|
137
146
|
|
|
138
|
-
## 📁 Project Structure
|
|
139
|
-
|
|
140
|
-
```
|
|
141
|
-
i18n-management-toolkit/
|
|
142
|
-
├── main/ # Core i18ntk scripts
|
|
143
|
-
│ ├── i18ntk-analyze.js # Translation analysis
|
|
144
|
-
│ ├── i18ntk-autorun.js # Automated workflow execution
|
|
145
|
-
│ ├── i18ntk-complete.js # Complete missing translations
|
|
146
|
-
│ ├── i18ntk-init.js # Initialize i18n setup
|
|
147
|
-
│ ├── i18ntk-manage.js # Main management interface
|
|
148
|
-
│ ├── i18ntk-sizing.js # Generate sizing reports
|
|
149
|
-
│ ├── i18ntk-summary.js # Generate summary reports
|
|
150
|
-
│ ├── i18ntk-usage.js # Analyze translation usage
|
|
151
|
-
│ ├── i18ntk-validate.js # Validate translations
|
|
152
|
-
│ └── i18ntk-ui.js # UI internationalization
|
|
153
|
-
├── utils/ # Utility scripts and helpers
|
|
154
|
-
│ ├── admin-auth.js # Admin authentication
|
|
155
|
-
│ ├── admin-cli.js # Admin command-line interface
|
|
156
|
-
│ ├── admin-pin.js # PIN management
|
|
157
|
-
│ ├── i18n-helper.js # i18n utility functions
|
|
158
|
-
│ ├── security.js # Security utilities
|
|
159
|
-
│ ├── detect-language-mismatches.js # Language validation
|
|
160
|
-
│ ├── maintain-language-purity.js # Language purity tools
|
|
161
|
-
│ ├── native-translations.js # Native translation helpers
|
|
162
|
-
│ ├── translate-mismatches.js # Translation mismatch tools
|
|
163
|
-
│ ├── validate-language-purity.js # Language purity validation
|
|
164
|
-
│ ├── test-complete-system.js # System testing
|
|
165
|
-
│ └── test-console-i18n.js # Console i18n testing
|
|
166
|
-
├── dev/ # Development and debugging tools
|
|
167
|
-
│ ├── debug/ # Debug utilities and analyzers
|
|
168
|
-
│ │ ├── debugger.js # Main debugger
|
|
169
|
-
│ │ ├── console-translations.js # Console translation tools
|
|
170
|
-
│ │ ├── complete-console-translations.js # Console completion
|
|
171
|
-
│ │ ├── console-key-checker.js # Console key validation
|
|
172
|
-
│ │ ├── export-missing-keys.js # Missing key export
|
|
173
|
-
│ │ ├── find-extra-keys.js # Extra key detection
|
|
174
|
-
│ │ ├── normalize-locales.js # Locale normalization
|
|
175
|
-
│ │ ├── refactor-locales.js # Locale refactoring
|
|
176
|
-
│ │ ├── reorder-locales.js # Locale reordering
|
|
177
|
-
│ │ └── replace-hardcoded-console.js # Console replacement
|
|
178
|
-
│ └── tests/ # Test suite
|
|
179
|
-
│ ├── test-complete-system.js # Complete system tests
|
|
180
|
-
│ ├── test-console-i18n.js # Console i18n tests
|
|
181
|
-
│ ├── test-features.js # Feature tests
|
|
182
|
-
│ └── test-report.json # Test reports
|
|
183
|
-
├── docs/ # Comprehensive documentation
|
|
184
|
-
│ ├── api/ # API documentation
|
|
185
|
-
│ │ ├── API_REFERENCE.md # Complete API reference
|
|
186
|
-
│ │ ├── COMPONENTS.md # Component documentation
|
|
187
|
-
│ │ ├── CONFIGURATION.md # Configuration guide
|
|
188
|
-
│ │ └── NPM_PUBLISHING_GUIDE.md # NPM publishing guide
|
|
189
|
-
│ ├── debug/ # Debug documentation
|
|
190
|
-
│ │ ├── DEBUG_README.md # Debug overview
|
|
191
|
-
│ │ └── DEBUG_TOOLS.md # Debug tools guide
|
|
192
|
-
│ ├── development/ # Development documentation
|
|
193
|
-
│ │ ├── AGENTS.md # AI agent guidelines
|
|
194
|
-
│ │ ├── DEVELOPMENT_RULES.md # Development rules
|
|
195
|
-
│ │ └── DEV_README.md # Development overview
|
|
196
|
-
│ ├── release-notes/ # Release documentation
|
|
197
|
-
│ │ ├── RELEASE_NOTES_v1.6.0.md # v1.6.0 release notes
|
|
198
|
-
│ │ ├── RELEASE_NOTES_v1.6.1.md # v1.6.1 release notes
|
|
199
|
-
│ │ └── RELEASE_NOTES_v1.0.0.md # v1.0.0 release notes
|
|
200
|
-
│ ├── reports/ # Report documentation
|
|
201
|
-
│ │ ├── ANALYSIS_README.md # Analysis reports
|
|
202
|
-
│ │ ├── SIZING_README.md # Sizing reports
|
|
203
|
-
│ │ ├── SUMMARY_README.md # Summary reports
|
|
204
|
-
│ │ ├── USAGE_README.md # Usage reports
|
|
205
|
-
│ │ └── VALIDATION_README.md # Validation reports
|
|
206
|
-
│ ├── INSTALLATION.md # Installation guide
|
|
207
|
-
│ ├── README.md # Documentation overview
|
|
208
|
-
│ └── TODO_ROADMAP.md # Future roadmap
|
|
209
|
-
├── scripts/ # Utility scripts
|
|
210
|
-
│ ├── fix-missing-translation-keys.js # Translation key fixes
|
|
211
|
-
│ └── verify-package.js # Package verification
|
|
212
|
-
├── settings/ # Configuration management
|
|
213
|
-
│ ├── admin-config.json # Admin configuration
|
|
214
|
-
│ ├── i18ntk-config.json # User configuration (main config file)
|
|
215
|
-
│ ├── settings-cli.js # Settings CLI
|
|
216
|
-
│ ├── settings-manager.js # Settings management
|
|
217
|
-
│ └── backups/ # Configuration backups
|
|
218
|
-
├── locales/ # Sample project translation files
|
|
219
|
-
│ ├── en/ # English translations
|
|
220
|
-
│ ├── de/ # German translations
|
|
221
|
-
│ ├── es/ # Spanish translations
|
|
222
|
-
│ ├── fr/ # French translations
|
|
223
|
-
│ └── ru/ # Russian translations
|
|
224
|
-
├── ui-locales/ # Toolkit's UI translations (7 languages)
|
|
225
|
-
│ ├── en.json # English UI
|
|
226
|
-
│ ├── de.json # German UI
|
|
227
|
-
│ ├── es.json # Spanish UI
|
|
228
|
-
│ ├── fr.json # French UI
|
|
229
|
-
│ ├── ja.json # Japanese UI
|
|
230
|
-
│ ├── ru.json # Russian UI
|
|
231
|
-
│ └── zh.json # Chinese UI
|
|
232
|
-
├── i18ntk-reports/ # Generated analysis reports
|
|
233
|
-
│ ├── analysis/ # Translation analysis
|
|
234
|
-
│ ├── validation/ # Validation reports
|
|
235
|
-
│ ├── usage/ # Usage analysis
|
|
236
|
-
│ ├── sizing/ # Sizing reports
|
|
237
|
-
│ ├── summary/ # Summary reports
|
|
238
|
-
│ └── workflow/ # Workflow reports
|
|
239
|
-
├── package.json # NPM package configuration
|
|
240
|
-
├── CHANGELOG.md # Version history
|
|
241
|
-
├── INDEX.md # Documentation index
|
|
242
|
-
└── README.md # This file
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
### 📋 TODO
|
|
247
|
-
|
|
248
|
-
- **🔍 Enhanced Debug Tools**: Expand debugging capabilities with more comprehensive analysis tools
|
|
249
|
-
- **📊 Advanced Reporting**: Improve report generation with more detailed analytics
|
|
250
|
-
- **🚀 Performance Optimization**: Further optimize translation processing for large projects
|
|
251
|
-
- **🌍 Additional Language Support**: Expand UI language support beyond current 6 languages
|
|
252
|
-
- **📝 UI-Locales Structure Refactor (Planned)**: Refactor `ui-locales/*.json` to use a multi-language object format for each key, e.g.:
|
|
253
|
-
|
|
254
|
-
```json
|
|
255
|
-
{
|
|
256
|
-
"analyzeTranslations": {
|
|
257
|
-
"reportTitle": {
|
|
258
|
-
"en": "TRANSLATION ANALYSIS REPORT FOR {language}",
|
|
259
|
-
"de": "ÜBERSETZUNGSANALYSENBERICHT FÜR {language}",
|
|
260
|
-
"fr": "RAPPORT D'ANALYSE DE TRADUCTION POUR {language}",
|
|
261
|
-
"es": "INFORME DE ANÁLISIS DE TRADUCCIÓN PARA {language}",
|
|
262
|
-
"ru": "ОТЧЁТ О АНАЛИЗЕ ПЕРЕВОДА ДЛЯ {language}",
|
|
263
|
-
"ja": "{language} の翻訳分析レポート",
|
|
264
|
-
"zh": "{language} 翻译分析报告"
|
|
265
|
-
},
|
|
266
|
-
"generated": {
|
|
267
|
-
"en": "Generated: {timestamp}",
|
|
268
|
-
"de": "Erstellt: {timestamp}",
|
|
269
|
-
"fr": "Généré : {timestamp}",
|
|
270
|
-
"es": "Generado: {timestamp}",
|
|
271
|
-
"ru": "Сгенерировано: {timestamp}",
|
|
272
|
-
"ja": "生成日時: {timestamp}",
|
|
273
|
-
"zh": "生成时间: {timestamp}"
|
|
274
|
-
},
|
|
275
|
-
"status": {
|
|
276
|
-
"en": "Status: {translated}/{total} translated ({percentage}%)",
|
|
277
|
-
"de": "Status: {translated}/{total} übersetzt ({percentage}%)",
|
|
278
|
-
"fr": "Statut : {translated}/{total} traduit ({percentage}%)",
|
|
279
|
-
"es": "Estado: {translated}/{total} traducido ({percentage}%)",
|
|
280
|
-
"ru": "Статус: переведено {translated}/{total} ({percentage}%)",
|
|
281
|
-
"ja": "状況: {total}中{translated}件翻訳済み ({percentage}%)",
|
|
282
|
-
"zh": "状态:{translated}/{total} 已翻译 ({percentage}%)"
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
```
|
|
287
|
-
|
|
288
147
|
> **📖 For detailed setup and usage instructions, see [Documentation](./docs/README.md)**
|
|
289
148
|
|
|
290
149
|
## 🛠️ Core Commands
|
|
@@ -304,37 +163,8 @@ i18n-management-toolkit/
|
|
|
304
163
|
| `npm run i18ntk:summary` | Generate summary reports | `node main/i18ntk-summary.js` |
|
|
305
164
|
| `npm run i18ntk:debug` | Debug and diagnostics | `node dev/debug/debugger.js` |
|
|
306
165
|
|
|
307
|
-
### Utility Scripts
|
|
308
|
-
|
|
309
|
-
| Script | Description | Usage |
|
|
310
|
-
|--------|-------------|-------|
|
|
311
|
-
| `settings-cli.js` | Configure toolkit settings | `node settings-cli.js` |
|
|
312
|
-
| `utils/admin-cli.js` | Admin operations | `node utils/admin-cli.js` |
|
|
313
|
-
|
|
314
166
|
> **📖 For complete command reference, see [API Documentation](./docs/api/API_REFERENCE.md)**
|
|
315
167
|
|
|
316
|
-
## 🔧 Configuration
|
|
317
|
-
|
|
318
|
-
### User Configuration (`i18ntk-config.json`)
|
|
319
|
-
```json
|
|
320
|
-
{
|
|
321
|
-
"localesPath": "./locales",
|
|
322
|
-
"supportedLanguages": ["en", "es", "fr", "de", "ru"],
|
|
323
|
-
"defaultLanguage": "en",
|
|
324
|
-
"excludePatterns": ["node_modules", ".git"],
|
|
325
|
-
"includePatterns": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"]
|
|
326
|
-
}
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
### Admin Configuration (`admin-config.json`)
|
|
330
|
-
```json
|
|
331
|
-
{
|
|
332
|
-
"adminPasswordHash": "...",
|
|
333
|
-
"securityEnabled": true,
|
|
334
|
-
"backupEnabled": true
|
|
335
|
-
}
|
|
336
|
-
```
|
|
337
|
-
|
|
338
168
|
## 📊 Reports and Analysis
|
|
339
169
|
|
|
340
170
|
The toolkit generates comprehensive reports in the `i18ntk-reports/` directory:
|
|
@@ -351,26 +181,9 @@ The toolkit generates comprehensive reports in the `i18ntk-reports/` directory:
|
|
|
351
181
|
|
|
352
182
|
## 🌍 Supported Languages
|
|
353
183
|
|
|
354
|
-
The toolkit UI supports **7 languages** with
|
|
355
|
-
|
|
356
|
-
| Language | Code | Status | Coverage |
|
|
357
|
-
|----------|------|--------|----------|
|
|
358
|
-
| 🇺🇸 English | `en` | ✅ Complete | 573/573 keys (100%) |
|
|
359
|
-
| 🇩🇪 German | `de` | ✅ Complete | 573/573 keys (100%) |
|
|
360
|
-
| 🇪🇸 Spanish | `es` | ✅ Complete | 573/573 keys (100%) |
|
|
361
|
-
| 🇫🇷 French | `fr` | ✅ Complete | 573/573 keys (100%) |
|
|
362
|
-
| 🇯🇵 Japanese | `ja` | ✅ Complete | 573/573 keys (100%) |
|
|
363
|
-
| 🇷🇺 Russian | `ru` | ✅ Complete | 573/573 keys (100%) |
|
|
364
|
-
| 🇨🇳 Chinese | `zh` | ✅ Complete | 573/573 keys (100%) |
|
|
184
|
+
The toolkit UI supports **7 languages** with partial internationalization:
|
|
365
185
|
|
|
366
|
-
|
|
367
|
-
- 100% console output internationalization
|
|
368
|
-
- Complete UI element translation
|
|
369
|
-
- Dynamic placeholder support (`{language}`, `{fileName}`, etc.)
|
|
370
|
-
- Zero missing or extra translation keys
|
|
371
|
-
- Verified translation patterns across all languages
|
|
372
|
-
|
|
373
|
-
Contributions for additional languages are welcome!
|
|
186
|
+
Requests for additional languages are welcome!
|
|
374
187
|
|
|
375
188
|
## 🧪 Development and Testing
|
|
376
189
|
|
|
@@ -379,36 +192,8 @@ Contributions for additional languages are welcome!
|
|
|
379
192
|
# Main debug interface
|
|
380
193
|
npm run i18ntk:debug
|
|
381
194
|
|
|
382
|
-
# Check console translations
|
|
383
|
-
node dev/debug/console-translations.js
|
|
384
|
-
|
|
385
|
-
# Complete console translations
|
|
386
|
-
node dev/debug/complete-console-translations.js
|
|
387
|
-
|
|
388
|
-
# Replace hardcoded console messages
|
|
389
|
-
node dev/debug/replace-hardcoded-console.js
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
### Testing
|
|
393
|
-
```bash
|
|
394
|
-
# Run complete system test
|
|
395
|
-
node dev/tests/test-complete-system.js
|
|
396
|
-
|
|
397
|
-
# Test console i18n
|
|
398
|
-
node dev/tests/test-console-i18n.js
|
|
399
|
-
|
|
400
|
-
# Test all features
|
|
401
|
-
node dev/tests/test-features.js
|
|
402
|
-
```
|
|
403
|
-
|
|
404
195
|
> **📖 For comprehensive debug tools documentation, see [Debug Tools](./docs/debug/DEBUG_TOOLS.md)**
|
|
405
196
|
|
|
406
|
-
## 🔒 Security Features
|
|
407
|
-
|
|
408
|
-
- Admin authentication for sensitive operations
|
|
409
|
-
- Secure password hashing
|
|
410
|
-
- Configuration backup system
|
|
411
|
-
- Input validation and sanitization
|
|
412
197
|
|
|
413
198
|
## 📝 Best Practices
|
|
414
199
|
|
|
@@ -435,7 +220,7 @@ node dev/tests/test-features.js
|
|
|
435
220
|
|
|
436
221
|
---
|
|
437
222
|
|
|
438
|
-
**Version:** 1.1
|
|
223
|
+
**Version:** 1.2.1 – Directory path fixes and configuration improvements! 🎯
|
|
439
224
|
## 📄 License
|
|
440
225
|
|
|
441
226
|
This project is licensed under the MIT License - see the `LICENSE` file for details.
|
package/main/i18ntk-init.js
CHANGED
|
@@ -164,8 +164,85 @@ class I18nInitializer {
|
|
|
164
164
|
return parsed;
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
+
// Detect existing translation directories and prompt user
|
|
168
|
+
async detectExistingDirectories() {
|
|
169
|
+
const possibleLocations = [
|
|
170
|
+
'./locales',
|
|
171
|
+
'./src/locales',
|
|
172
|
+
'./src/i18n/locales',
|
|
173
|
+
'./app/locales',
|
|
174
|
+
'./public/locales',
|
|
175
|
+
'./translations',
|
|
176
|
+
'./lang',
|
|
177
|
+
'./i18n/locales',
|
|
178
|
+
'./assets/locales',
|
|
179
|
+
'./client/locales',
|
|
180
|
+
'./frontend/locales'
|
|
181
|
+
];
|
|
182
|
+
|
|
183
|
+
const existingLocations = [];
|
|
184
|
+
|
|
185
|
+
// Check for existing translation directories
|
|
186
|
+
for (const location of possibleLocations) {
|
|
187
|
+
if (fs.existsSync(location)) {
|
|
188
|
+
try {
|
|
189
|
+
const items = fs.readdirSync(location);
|
|
190
|
+
const hasLanguageDirs = items.some(item => {
|
|
191
|
+
const itemPath = path.join(location, item);
|
|
192
|
+
if (fs.statSync(itemPath).isDirectory()) {
|
|
193
|
+
return ['en', 'de', 'es', 'fr', 'ru', 'ja', 'zh'].includes(item);
|
|
194
|
+
}
|
|
195
|
+
return item.endsWith('.json');
|
|
196
|
+
});
|
|
197
|
+
if (hasLanguageDirs) {
|
|
198
|
+
existingLocations.push(location);
|
|
199
|
+
}
|
|
200
|
+
} catch (error) {
|
|
201
|
+
// Continue checking other locations
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (existingLocations.length > 0) {
|
|
207
|
+
console.log('\n' + this.ui.t('init.existingDirectoriesFound'));
|
|
208
|
+
console.log('=' .repeat(50));
|
|
209
|
+
|
|
210
|
+
existingLocations.forEach((location, index) => {
|
|
211
|
+
console.log(` ${index + 1}. ${location}`);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
const answer = await this.prompt('\n' + this.ui.t('init.useExistingDirectoryPrompt'));
|
|
215
|
+
const selectedIndex = parseInt(answer) - 1;
|
|
216
|
+
|
|
217
|
+
if (selectedIndex >= 0 && selectedIndex < existingLocations.length) {
|
|
218
|
+
const selectedDir = existingLocations[selectedIndex];
|
|
219
|
+
console.log(this.ui.t('init.usingExistingDirectory', { dir: selectedDir }));
|
|
220
|
+
|
|
221
|
+
// Update settings to use the existing directory
|
|
222
|
+
this.config.sourceDir = selectedDir;
|
|
223
|
+
this.sourceDir = path.resolve(selectedDir);
|
|
224
|
+
this.sourceLanguageDir = path.join(this.sourceDir, this.config.sourceLanguage);
|
|
225
|
+
|
|
226
|
+
// Save to settings
|
|
227
|
+
settingsManager.setDirectories({ sourceDir: selectedDir });
|
|
228
|
+
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
|
|
167
236
|
// Setup initial directory structure if needed
|
|
168
237
|
async setupInitialStructure() {
|
|
238
|
+
// First, detect if there are existing translation directories
|
|
239
|
+
const usedExisting = await this.detectExistingDirectories();
|
|
240
|
+
|
|
241
|
+
if (usedExisting) {
|
|
242
|
+
console.log(this.ui.t('init.usingExistingStructure', { dir: this.sourceDir }));
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
|
|
169
246
|
// Validate paths
|
|
170
247
|
const validatedSourceDir = SecurityUtils.validatePath(this.sourceDir, process.cwd());
|
|
171
248
|
const validatedSourceLanguageDir = SecurityUtils.validatePath(this.sourceLanguageDir, process.cwd());
|
|
@@ -175,14 +252,14 @@ class I18nInitializer {
|
|
|
175
252
|
throw new Error('Invalid directory paths detected');
|
|
176
253
|
}
|
|
177
254
|
|
|
178
|
-
// Create source directory if it doesn't exist
|
|
255
|
+
// Create source directory only if it doesn't exist and no existing was detected
|
|
179
256
|
if (!fs.existsSync(validatedSourceDir)) {
|
|
180
257
|
console.log(this.ui.t('init.creatingSourceDirectory', { dir: validatedSourceDir }));
|
|
181
258
|
fs.mkdirSync(validatedSourceDir, { recursive: true });
|
|
182
259
|
SecurityUtils.logSecurityEvent('Source directory created', 'info', { dir: validatedSourceDir });
|
|
183
260
|
}
|
|
184
261
|
|
|
185
|
-
// Create source language directory if it doesn't exist
|
|
262
|
+
// Create source language directory only if it doesn't exist
|
|
186
263
|
if (!fs.existsSync(validatedSourceLanguageDir)) {
|
|
187
264
|
console.log(this.ui.t('init.creatingSourceLanguageDirectory', { dir: validatedSourceLanguageDir }));
|
|
188
265
|
fs.mkdirSync(validatedSourceLanguageDir, { recursive: true });
|
package/main/i18ntk-manage.js
CHANGED
|
@@ -96,8 +96,17 @@ class I18nManager {
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
// Auto-detect i18n directory from common locations
|
|
99
|
+
// Auto-detect i18n directory from common locations only if not configured in settings
|
|
100
100
|
detectI18nDirectory() {
|
|
101
|
+
const settings = settingsManager.getSettings();
|
|
102
|
+
|
|
103
|
+
// Use settings configuration if available
|
|
104
|
+
if (settings.directories?.sourceDir) {
|
|
105
|
+
this.config.sourceDir = settings.directories.sourceDir;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Only auto-detect if no settings are configured
|
|
101
110
|
for (const possiblePath of this.config.possibleI18nPaths) {
|
|
102
111
|
const resolvedPath = path.resolve(possiblePath);
|
|
103
112
|
if (fs.existsSync(resolvedPath)) {
|
|
@@ -459,10 +468,9 @@ class I18nManager {
|
|
|
459
468
|
console.log(`7. ${this.ui.t('menu.options.workflow')}`);
|
|
460
469
|
console.log(`8. ${this.ui.t('menu.options.status')}`);
|
|
461
470
|
console.log(`9. ${this.ui.t('menu.options.delete')}`);
|
|
462
|
-
console.log(`10. ${this.ui.t('menu.options.
|
|
463
|
-
console.log(`11. ${this.ui.t('menu.options.
|
|
464
|
-
console.log(`12. ${this.ui.t('menu.options.
|
|
465
|
-
console.log(`13. ${this.ui.t('menu.options.debug')}`);
|
|
471
|
+
console.log(`10. ${this.ui.t('menu.options.settings')}`);
|
|
472
|
+
console.log(`11. ${this.ui.t('menu.options.help')}`);
|
|
473
|
+
console.log(`12. ${this.ui.t('menu.options.debug')}`);
|
|
466
474
|
console.log(`0. ${this.ui.t('menu.options.exit')}`);
|
|
467
475
|
console.log('\n' + this.ui.t('menu.nonInteractiveModeWarning'));
|
|
468
476
|
console.log(this.ui.t('menu.useDirectExecution'));
|
|
@@ -483,10 +491,9 @@ class I18nManager {
|
|
|
483
491
|
console.log(`7. ${this.ui.t('menu.options.workflow')}`);
|
|
484
492
|
console.log(`8. ${this.ui.t('menu.options.status')}`);
|
|
485
493
|
console.log(`9. ${this.ui.t('menu.options.delete')}`);
|
|
486
|
-
console.log(`10. ${this.ui.t('menu.options.
|
|
487
|
-
console.log(`11. ${this.ui.t('menu.options.
|
|
488
|
-
console.log(`12. ${this.ui.t('menu.options.
|
|
489
|
-
console.log(`13. ${this.ui.t('menu.options.debug')}`);
|
|
494
|
+
console.log(`10. ${this.ui.t('menu.options.settings')}`);
|
|
495
|
+
console.log(`11. ${this.ui.t('menu.options.help')}`);
|
|
496
|
+
console.log(`12. ${this.ui.t('menu.options.debug')}`);
|
|
490
497
|
console.log(`0. ${this.ui.t('menu.options.exit')}`);
|
|
491
498
|
|
|
492
499
|
const choice = await this.prompt('\n' + this.ui.t('menu.selectOptionPrompt'));
|
|
@@ -556,17 +563,14 @@ class I18nManager {
|
|
|
556
563
|
await this.deleteReports();
|
|
557
564
|
break;
|
|
558
565
|
case '10':
|
|
559
|
-
await this.changeLanguage();
|
|
560
|
-
break;
|
|
561
|
-
case '11':
|
|
562
566
|
await this.showSettingsMenu();
|
|
563
567
|
break;
|
|
564
|
-
case '
|
|
568
|
+
case '11':
|
|
565
569
|
this.showHelp();
|
|
566
570
|
await this.prompt(this.ui.t('menu.returnToMainMenu'));
|
|
567
571
|
await this.showInteractiveMenu();
|
|
568
572
|
break;
|
|
569
|
-
case '
|
|
573
|
+
case '12':
|
|
570
574
|
await this.showDebugMenu();
|
|
571
575
|
break;
|
|
572
576
|
case '0':
|
|
@@ -888,46 +892,7 @@ class I18nManager {
|
|
|
888
892
|
await this.showInteractiveMenu();
|
|
889
893
|
}
|
|
890
894
|
|
|
891
|
-
|
|
892
|
-
async changeLanguage() {
|
|
893
|
-
console.log(this.ui.t('language.changeTitle'));
|
|
894
|
-
console.log('=' .repeat(50));
|
|
895
|
-
|
|
896
|
-
const languages = {
|
|
897
|
-
'en': '🇺🇸 English',
|
|
898
|
-
'de': '🇩🇪 Deutsch',
|
|
899
|
-
'es': '🇪🇸 Español',
|
|
900
|
-
'fr': '🇫🇷 Français',
|
|
901
|
-
'ru': '🇷🇺 Русский',
|
|
902
|
-
'ja': '🇯🇵 日本語',
|
|
903
|
-
'zh': '🇨🇳 中文'
|
|
904
|
-
};
|
|
905
|
-
|
|
906
|
-
console.log(this.ui.t('language.available'));
|
|
907
|
-
Object.entries(languages).forEach(([code, name], index) => {
|
|
908
|
-
console.log(` ${index + 1}. ${code} - ${name}`);
|
|
909
|
-
});
|
|
910
|
-
|
|
911
|
-
const choice = await this.prompt('\nSelect language (1-7): ');
|
|
912
|
-
const languageCodes = Object.keys(languages);
|
|
913
|
-
const selectedIndex = parseInt(choice) - 1;
|
|
914
|
-
|
|
915
|
-
if (selectedIndex >= 0 && selectedIndex < languageCodes.length) {
|
|
916
|
-
const selectedLang = languageCodes[selectedIndex];
|
|
917
|
-
this.ui.loadLanguage(selectedLang);
|
|
918
|
-
|
|
919
|
-
// Save to settings
|
|
920
|
-
const settingsManager = require('../settings/settings-manager');
|
|
921
|
-
settingsManager.setLanguage(selectedLang);
|
|
922
|
-
|
|
923
|
-
console.log(`✅ Language changed to ${languages[selectedLang]}`);
|
|
924
|
-
} else {
|
|
925
|
-
console.log(this.ui.t('language.invalidSelection'));
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
await this.prompt(this.ui.t('menu.pressEnterToContinue'));
|
|
929
|
-
await this.showInteractiveMenu();
|
|
930
|
-
}
|
|
895
|
+
|
|
931
896
|
|
|
932
897
|
prompt(question) {
|
|
933
898
|
return new Promise((resolve) => {
|
package/main/i18ntk-usage.js
CHANGED
|
@@ -29,85 +29,88 @@ const settingsManager = require('../settings/settings-manager');
|
|
|
29
29
|
const SecurityUtils = require('../utils/security');
|
|
30
30
|
const AdminCLI = require('../utils/admin-cli');
|
|
31
31
|
|
|
32
|
-
// Enhanced configuration
|
|
32
|
+
// Enhanced configuration that prioritizes settings over auto-detection
|
|
33
33
|
async function getConfig() {
|
|
34
34
|
try {
|
|
35
35
|
const settings = settingsManager.getSettings();
|
|
36
36
|
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
'./src',
|
|
41
|
-
'./app',
|
|
42
|
-
'./components',
|
|
43
|
-
'./pages',
|
|
44
|
-
'./views',
|
|
45
|
-
'./client',
|
|
46
|
-
'./frontend',
|
|
47
|
-
'./' // Current directory as fallback
|
|
48
|
-
];
|
|
37
|
+
// Only use auto-detection if no settings are configured
|
|
38
|
+
let sourceDir = settings.directories?.sourceDir;
|
|
39
|
+
let i18nDir = settings.directories?.i18nDir;
|
|
49
40
|
|
|
50
|
-
// Auto-detect
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
41
|
+
// Auto-detect only if settings don't specify directories
|
|
42
|
+
if (!sourceDir) {
|
|
43
|
+
const possibleSourceDirs = [
|
|
44
|
+
'./main', // Primary source directory for this project
|
|
45
|
+
'./src',
|
|
46
|
+
'./app',
|
|
47
|
+
'./components',
|
|
48
|
+
'./pages',
|
|
49
|
+
'./views',
|
|
50
|
+
'./client',
|
|
51
|
+
'./frontend',
|
|
52
|
+
'./' // Current directory as fallback
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
for (const dir of possibleSourceDirs) {
|
|
56
|
+
if (fs.existsSync(dir)) {
|
|
57
|
+
try {
|
|
58
|
+
const files = fs.readdirSync(dir);
|
|
59
|
+
const hasCodeFiles = files.some(file =>
|
|
60
|
+
['.js', '.jsx', '.ts', '.tsx', '.vue', '.svelte'].includes(path.extname(file))
|
|
61
|
+
);
|
|
62
|
+
if (hasCodeFiles) {
|
|
63
|
+
sourceDir = dir;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
} catch (error) {
|
|
67
|
+
// Continue checking
|
|
63
68
|
}
|
|
64
|
-
} catch (error) {
|
|
65
|
-
// Continue checking
|
|
66
69
|
}
|
|
67
70
|
}
|
|
71
|
+
sourceDir = sourceDir || './src'; // Final fallback
|
|
68
72
|
}
|
|
69
73
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
74
|
+
if (!i18nDir) {
|
|
75
|
+
const possibleI18nDirs = [
|
|
76
|
+
'./locales',
|
|
77
|
+
'./src/locales',
|
|
78
|
+
'./src/i18n',
|
|
79
|
+
'./src/i18n/locales',
|
|
80
|
+
'./app/locales',
|
|
81
|
+
'./app/i18n',
|
|
82
|
+
'./public/locales',
|
|
83
|
+
'./assets/locales',
|
|
84
|
+
'./translations',
|
|
85
|
+
'./lang'
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
for (const dir of possibleI18nDirs) {
|
|
89
|
+
if (fs.existsSync(dir)) {
|
|
90
|
+
try {
|
|
91
|
+
const items = fs.readdirSync(dir);
|
|
92
|
+
const hasLanguageDirs = items.some(item => {
|
|
93
|
+
const itemPath = path.join(dir, item);
|
|
94
|
+
if (fs.statSync(itemPath).isDirectory()) {
|
|
95
|
+
return ['en', 'de', 'es', 'fr', 'ru', 'ja', 'zh'].includes(item);
|
|
96
|
+
}
|
|
97
|
+
return item.endsWith('.json');
|
|
98
|
+
});
|
|
99
|
+
if (hasLanguageDirs) {
|
|
100
|
+
i18nDir = dir;
|
|
101
|
+
break;
|
|
95
102
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (hasLanguageDirs) {
|
|
99
|
-
detectedI18nDir = dir;
|
|
100
|
-
break;
|
|
103
|
+
} catch (error) {
|
|
104
|
+
// Continue checking
|
|
101
105
|
}
|
|
102
|
-
} catch (error) {
|
|
103
|
-
// Continue checking
|
|
104
106
|
}
|
|
105
107
|
}
|
|
108
|
+
i18nDir = i18nDir || './locales'; // Final fallback
|
|
106
109
|
}
|
|
107
110
|
|
|
108
111
|
const config = {
|
|
109
|
-
sourceDir:
|
|
110
|
-
i18nDir:
|
|
112
|
+
sourceDir: sourceDir,
|
|
113
|
+
i18nDir: i18nDir,
|
|
111
114
|
sourceLanguage: settings.directories?.sourceLanguage || settings.sourceLanguage || 'en',
|
|
112
115
|
outputDir: settings.directories?.outputDir || settings.outputDir || './i18ntk-reports',
|
|
113
116
|
excludeDirs: settings.processing?.excludeDirs || [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "i18ntk",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "i18ntk (i18n Toolkit) - A comprehensive, enterprise-grade internationalization (i18n) management toolkit for JavaScript/TypeScript projects with advanced analysis, validation, and automation features",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"i18n",
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
},
|
|
125
125
|
"preferGlobal": true,
|
|
126
126
|
"versionInfo": {
|
|
127
|
-
"version": "1.1
|
|
127
|
+
"version": "1.2.1",
|
|
128
128
|
"releaseDate": "02/08/2025",
|
|
129
129
|
"lastUpdated": "02/08/2025",
|
|
130
130
|
"maintainer": "Vladimir Noskov",
|
|
@@ -136,11 +136,14 @@
|
|
|
136
136
|
"🐛 Marked all previous versions as deprecated due to bugs",
|
|
137
137
|
"🎉 Celebrated 200+ downloads milestone",
|
|
138
138
|
"🔗 Fixed repository URLs to point to correct GitHub location",
|
|
139
|
-
"📋 Updated all version references to 1.
|
|
139
|
+
"📋 Updated all version references to 1.2.0",
|
|
140
|
+
"🌐 Temporarily disabled UI language switching to focus on English core functionality",
|
|
141
|
+
"📊 Centralized reports in i18ntk-reports/ directory",
|
|
142
|
+
"⚙️ Organized configuration files in settings/ directory"
|
|
140
143
|
],
|
|
141
|
-
"breakingChanges": [],
|
|
142
|
-
"deprecations": ["<1.
|
|
143
|
-
"nextVersion": "1.1
|
|
144
|
+
"breakingChanges": ["Removed option 10 (Change UI language) from main menu"],
|
|
145
|
+
"deprecations": ["<1.2.0", "1.0.x", "1.1.x"],
|
|
146
|
+
"nextVersion": "1.2.1",
|
|
144
147
|
"supportedNodeVersions": ">=16.0.0",
|
|
145
148
|
"supportedFrameworks": {
|
|
146
149
|
"react-i18next": ">=11.0.0",
|
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"partial_translation": "Partial translations: {count}",
|
|
63
63
|
"format_mismatch": "Format mismatches: {count}",
|
|
64
64
|
"type_mismatch": "Type mismatches: {count}",
|
|
65
|
-
"structure_mismatch": "Structure mismatches: {count}"
|
|
65
|
+
"structure_mismatch": "Structure mismatches: {count}",
|
|
66
|
+
"same_as_source": "Gleich wie Quelle: {count}"
|
|
66
67
|
},
|
|
67
68
|
"keysToTranslate": "📋 KEYS TO TRANSLATE",
|
|
68
69
|
"key": "Schlüssel",
|
package/ui-locales/de/init.json
CHANGED
|
@@ -34,5 +34,9 @@
|
|
|
34
34
|
"frameworks.i18next": "- i18next (i18next)",
|
|
35
35
|
"frameworks.nuxt": "- Nuxt i18n (@nuxtjs/i18n)",
|
|
36
36
|
"frameworks.svelte": "- Svelte i18n (svelte-i18n)",
|
|
37
|
-
"selectOptionPrompt": "Select an option:"
|
|
37
|
+
"selectOptionPrompt": "Select an option:",
|
|
38
|
+
"existingDirectoriesFound": "📁 Vorhandene Übersetzungsverzeichnisse gefunden:",
|
|
39
|
+
"useExistingDirectoryPrompt": "Vorhandenes Verzeichnis verwenden? Nummer eingeben (oder Enter für neues):",
|
|
40
|
+
"usingExistingDirectory": "✅ Vorhandenes Verzeichnis verwenden: {dir}",
|
|
41
|
+
"usingExistingStructure": "✅ Vorhandene Übersetzungsstruktur verwenden in: {dir}"
|
|
38
42
|
}
|
package/ui-locales/de/menu.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"workflow": "🔄 Run full workflow",
|
|
12
12
|
"status": "📋 Show project status",
|
|
13
13
|
"delete": "🗑️ Delete all reports",
|
|
14
|
-
"language": "🌍 Change UI language",
|
|
14
|
+
"language": "🌍 Change UI language (Coming Soon - English Only)",
|
|
15
15
|
"settings": "⚙️ Settings",
|
|
16
16
|
"help": "❓ Help",
|
|
17
17
|
"debug": "🔧 Debug Tools",
|
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"partial_translation": "Partial translations: {count}",
|
|
63
63
|
"format_mismatch": "Format mismatches: {count}",
|
|
64
64
|
"type_mismatch": "Type mismatches: {count}",
|
|
65
|
-
"structure_mismatch": "Structure mismatches: {count}"
|
|
65
|
+
"structure_mismatch": "Structure mismatches: {count}",
|
|
66
|
+
"same_as_source": "Same as source: {count}"
|
|
66
67
|
},
|
|
67
68
|
"keysToTranslate": "📋 KEYS TO TRANSLATE",
|
|
68
69
|
"key": "Key",
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"success": "Success",
|
|
3
|
-
"error": "Error"
|
|
3
|
+
"error": "Error",
|
|
4
|
+
"warning": "Warning",
|
|
5
|
+
"info": "Info",
|
|
6
|
+
"debug": "Debug",
|
|
7
|
+
"progress": "Progress",
|
|
8
|
+
"remaining": "Remaining",
|
|
9
|
+
"total": "Total",
|
|
10
|
+
"completed": "Completed",
|
|
11
|
+
"missing": "Missing",
|
|
12
|
+
"partial": "Partial",
|
|
13
|
+
"sameAsSource": "Same as source",
|
|
14
|
+
"formatMismatch": "Format mismatch",
|
|
15
|
+
"typeMismatch": "Type mismatch",
|
|
16
|
+
"structureMismatch": "Structure mismatch"
|
|
4
17
|
}
|
|
@@ -3,5 +3,15 @@
|
|
|
3
3
|
"genericError": "❌ Error: {{error}}",
|
|
4
4
|
"errorGeneratingStatusSummary": "Error generating status summary: {error}",
|
|
5
5
|
"errorRunningDebugTool": "Error running debug tool '{displayName}': {error}",
|
|
6
|
-
"errorReadingDebugLogs": "Error reading debug logs: {error}"
|
|
6
|
+
"errorReadingDebugLogs": "Error reading debug logs: {error}",
|
|
7
|
+
"errorAnalyzingLogFile": "Error analyzing log file: {error}",
|
|
8
|
+
"errorAnalyzingTranslationKeys": "Error analyzing translation keys: {error}",
|
|
9
|
+
"errorAnalyzingTranslationCompleteness": "Error analyzing translation completeness: {error}",
|
|
10
|
+
"errorAnalyzingTranslationFormat": "Error analyzing translation format: {error}",
|
|
11
|
+
"errorAnalyzingTranslationType": "Error analyzing translation type: {error}",
|
|
12
|
+
"errorAnalyzingTranslationStructure": "Error analyzing translation structure: {error}",
|
|
13
|
+
"errorAnalyzingTranslationFormatMismatch": "Error analyzing translation format mismatch: {error}",
|
|
14
|
+
"errorAnalyzingTranslationTypeMismatch": "Error analyzing translation type mismatch: {error}",
|
|
15
|
+
"errorAnalyzingTranslationStructureMismatch": "Error analyzing translation structure mismatch: {error}",
|
|
16
|
+
"errorAnalyzingTranslationSameAsSource": "Error analyzing translation same as source: {error}"
|
|
7
17
|
}
|
package/ui-locales/en/init.json
CHANGED
|
@@ -35,5 +35,9 @@
|
|
|
35
35
|
"frameworks.i18next": "- i18next (i18next)",
|
|
36
36
|
"frameworks.nuxt": "- Nuxt i18n (@nuxtjs/i18n)",
|
|
37
37
|
"frameworks.svelte": "- Svelte i18n (svelte-i18n)",
|
|
38
|
-
"selectOptionPrompt": "Select an option:"
|
|
38
|
+
"selectOptionPrompt": "Select an option:",
|
|
39
|
+
"existingDirectoriesFound": "📁 Existing translation directories found:",
|
|
40
|
+
"useExistingDirectoryPrompt": "Use existing directory? Enter number (or press Enter to create new):",
|
|
41
|
+
"usingExistingDirectory": "✅ Using existing directory: {dir}",
|
|
42
|
+
"usingExistingStructure": "✅ Using existing translation structure in: {dir}"
|
|
39
43
|
}
|
package/ui-locales/en/menu.json
CHANGED
|
@@ -32,5 +32,13 @@
|
|
|
32
32
|
"autoDetectedI18nDirectory": "Auto-detected i18n directory: {path}",
|
|
33
33
|
"executingCommand": "Executing command: {command}",
|
|
34
34
|
"unknownCommand": "Unknown command: {command}",
|
|
35
|
-
"languageOption": " {{index}}. {{displayName}}{{current}}"
|
|
35
|
+
"languageOption": " {{index}}. {{displayName}}{{current}}",
|
|
36
|
+
"debugTools": {
|
|
37
|
+
"1": "Log file analysis",
|
|
38
|
+
"2": "Translation key usage analysis",
|
|
39
|
+
"3": "Translation completeness analysis",
|
|
40
|
+
"4": "Translation format analysis",
|
|
41
|
+
"5": "Translation type analysis",
|
|
42
|
+
"6": "Translation structure analysis"
|
|
43
|
+
}
|
|
36
44
|
}
|
|
@@ -20,5 +20,6 @@
|
|
|
20
20
|
"inputDisallowedCharacters": "Security: Input contains disallowed characters",
|
|
21
21
|
"unknownCommandArg": "Unknown command argument",
|
|
22
22
|
"logMessage": "[SECURITY {level}] {timestamp}: {event}",
|
|
23
|
-
"alertMessage": "[SECURITY ALERT] {timestamp}: {event}"
|
|
23
|
+
"alertMessage": "[SECURITY ALERT] {timestamp}: {event}",
|
|
24
|
+
"securityWarning": "[SECURITY WARNING] {timestamp}: {event}"
|
|
24
25
|
}
|
|
@@ -6,5 +6,22 @@
|
|
|
6
6
|
"nextStep4": "4. Complete missing translations:",
|
|
7
7
|
"nextStep5": "5. Generate summary report:",
|
|
8
8
|
"nextStep6": "6. Review and finalize translations:",
|
|
9
|
-
"completed": "7. Completed successfully!"
|
|
9
|
+
"completed": "7. Completed successfully!",
|
|
10
|
+
"generating": "Generating summary report...",
|
|
11
|
+
"review": "Reviewing translations...",
|
|
12
|
+
"finalizing": "Finalizing translations...",
|
|
13
|
+
"finalized": "Finalized successfully!",
|
|
14
|
+
"errors": "Errors:",
|
|
15
|
+
"warnings": "Warnings:",
|
|
16
|
+
"info": "Info:",
|
|
17
|
+
"progress": "Progress:",
|
|
18
|
+
"remaining": "Remaining:",
|
|
19
|
+
"total": "Total:",
|
|
20
|
+
"completedKeys": "Completed keys:",
|
|
21
|
+
"missingKeys": "Missing keys:",
|
|
22
|
+
"partialKeys": "Partial keys:",
|
|
23
|
+
"sameAsSource": "Same as source:",
|
|
24
|
+
"formatMismatch": "Format mismatch:",
|
|
25
|
+
"typeMismatch": "Type mismatch:",
|
|
26
|
+
"structureMismatch": "Structure mismatch:"
|
|
10
27
|
}
|
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"partial_translation": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
63
63
|
"format_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
64
64
|
"type_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
65
|
-
"structure_mismatch": "⚠️ TRANSLATION NEEDED ⚠️"
|
|
65
|
+
"structure_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
66
|
+
"same_as_source": "Igual que la fuente: {count}"
|
|
66
67
|
},
|
|
67
68
|
"keysToTranslate": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
68
69
|
"key": "⚠️ TRANSLATION NEEDED ⚠️",
|
package/ui-locales/es/init.json
CHANGED
|
@@ -34,5 +34,9 @@
|
|
|
34
34
|
"frameworks.i18next": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
35
35
|
"frameworks.nuxt": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
36
36
|
"frameworks.svelte": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
37
|
-
"selectOptionPrompt": "
|
|
37
|
+
"selectOptionPrompt": "Seleccionar opción:",
|
|
38
|
+
"existingDirectoriesFound": "📁 Directorios de traducción existentes encontrados:",
|
|
39
|
+
"useExistingDirectoryPrompt": "¿Usar directorio existente? Ingresar número (o presionar Enter para crear nuevo):",
|
|
40
|
+
"usingExistingDirectory": "✅ Usando directorio existente: {dir}",
|
|
41
|
+
"usingExistingStructure": "✅ Usando estructura de traducción existente en: {dir}"
|
|
38
42
|
}
|
package/ui-locales/es/menu.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"workflow": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
12
12
|
"status": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
13
13
|
"delete": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
14
|
-
"language": "
|
|
14
|
+
"language": "🌍 Cambiar idioma de interfaz (Próximamente - Solo Inglés)",
|
|
15
15
|
"settings": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
16
16
|
"help": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
17
17
|
"debug": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"partial_translation": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
63
63
|
"format_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
64
64
|
"type_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
65
|
-
"structure_mismatch": "⚠️ TRANSLATION NEEDED ⚠️"
|
|
65
|
+
"structure_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
66
|
+
"same_as_source": "Identique à la source: {count}"
|
|
66
67
|
},
|
|
67
68
|
"keysToTranslate": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
68
69
|
"key": "⚠️ TRANSLATION NEEDED ⚠️",
|
package/ui-locales/fr/init.json
CHANGED
|
@@ -34,5 +34,9 @@
|
|
|
34
34
|
"frameworks.i18next": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
35
35
|
"frameworks.nuxt": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
36
36
|
"frameworks.svelte": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
37
|
-
"selectOptionPrompt": "
|
|
37
|
+
"selectOptionPrompt": "Sélectionner une option:",
|
|
38
|
+
"existingDirectoriesFound": "📁 Répertoires de traduction existants trouvés:",
|
|
39
|
+
"useExistingDirectoryPrompt": "Utiliser le répertoire existant ? Entrer le numéro (ou appuyer sur Entrée pour créer un nouveau):",
|
|
40
|
+
"usingExistingDirectory": "✅ Utilisation du répertoire existant : {dir}",
|
|
41
|
+
"usingExistingStructure": "✅ Utilisation de la structure de traduction existante dans : {dir}"
|
|
38
42
|
}
|
package/ui-locales/fr/menu.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"workflow": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
12
12
|
"status": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
13
13
|
"delete": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
14
|
-
"language": "
|
|
14
|
+
"language": "🌍 Changer la langue de l'interface (Bientôt disponible - Anglais uniquement)",
|
|
15
15
|
"settings": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
16
16
|
"help": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
17
17
|
"debug": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"partial_translation": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
63
63
|
"format_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
64
64
|
"type_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
65
|
-
"structure_mismatch": "⚠️ TRANSLATION NEEDED ⚠️"
|
|
65
|
+
"structure_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
66
|
+
"same_as_source": "ソースと同じ: {count}"
|
|
66
67
|
},
|
|
67
68
|
"keysToTranslate": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
68
69
|
"key": "⚠️ TRANSLATION NEEDED ⚠️",
|
package/ui-locales/ja/init.json
CHANGED
|
@@ -34,5 +34,9 @@
|
|
|
34
34
|
"frameworks.i18next": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
35
35
|
"frameworks.nuxt": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
36
36
|
"frameworks.svelte": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
37
|
-
"selectOptionPrompt": "
|
|
37
|
+
"selectOptionPrompt": "オプションを選択:",
|
|
38
|
+
"existingDirectoriesFound": "📁 既存の翻訳ディレクトリが見つかりました:",
|
|
39
|
+
"useExistingDirectoryPrompt": "既存のディレクトリを使用しますか?番号を入力(新規作成の場合はEnterを押してください):",
|
|
40
|
+
"usingExistingDirectory": "✅ 既存のディレクトリを使用: {dir}",
|
|
41
|
+
"usingExistingStructure": "✅ 既存の翻訳構造を使用: {dir}"
|
|
38
42
|
}
|
package/ui-locales/ja/menu.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"workflow": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
12
12
|
"status": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
13
13
|
"delete": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
14
|
-
"language": "
|
|
14
|
+
"language": "🌍 UI言語を変更 (近日公開 - 英語のみ)",
|
|
15
15
|
"settings": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
16
16
|
"help": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
17
17
|
"debug": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
@@ -57,12 +57,13 @@
|
|
|
57
57
|
"extraKeys": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
58
58
|
"issues": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
59
59
|
"issueType": {
|
|
60
|
-
"not_translated": "
|
|
61
|
-
"empty_value": "
|
|
62
|
-
"partial_translation": "
|
|
63
|
-
"format_mismatch": "
|
|
64
|
-
"type_mismatch": "
|
|
65
|
-
"structure_mismatch": "
|
|
60
|
+
"not_translated": "Не переведено: {count}",
|
|
61
|
+
"empty_value": "Пустые значения: {count}",
|
|
62
|
+
"partial_translation": "Частичный перевод: {count}",
|
|
63
|
+
"format_mismatch": "Несоответствие формата: {count}",
|
|
64
|
+
"type_mismatch": "Несоответствие типа: {count}",
|
|
65
|
+
"structure_mismatch": "Несоответствие структуры: {count}",
|
|
66
|
+
"same_as_source": "Такой же как источник: {count}"
|
|
66
67
|
},
|
|
67
68
|
"keysToTranslate": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
68
69
|
"key": "⚠️ TRANSLATION NEEDED ⚠️",
|
package/ui-locales/ru/init.json
CHANGED
|
@@ -34,5 +34,9 @@
|
|
|
34
34
|
"frameworks.i18next": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
35
35
|
"frameworks.nuxt": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
36
36
|
"frameworks.svelte": "⚠️ TRANSLATION NEEDED ⚠️",
|
|
37
|
-
"selectOptionPrompt": "
|
|
37
|
+
"selectOptionPrompt": "Выберите опцию:",
|
|
38
|
+
"existingDirectoriesFound": "📁 Найдены существующие каталоги переводов:",
|
|
39
|
+
"useExistingDirectoryPrompt": "Использовать существующий каталог? Введите номер (или нажмите Enter для создания нового):",
|
|
40
|
+
"usingExistingDirectory": "✅ Используется существующий каталог: {dir}",
|
|
41
|
+
"usingExistingStructure": "✅ Используется существующая структура переводов в: {dir}"
|
|
38
42
|
}
|
package/ui-locales/ru/menu.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"workflow": "🔄 Запустить полный рабочий процесс",
|
|
12
12
|
"status": "📋 Показать статус проекта",
|
|
13
13
|
"delete": "🗑️ Удалить все отчеты",
|
|
14
|
-
"language": "🌍 Изменить язык интерфейса",
|
|
14
|
+
"language": "🌍 Изменить язык интерфейса (Скоро будет доступно - Только английский)",
|
|
15
15
|
"settings": "⚙️ Настройки",
|
|
16
16
|
"help": "❓ Помощь",
|
|
17
17
|
"debug": "🔧 Инструменты отладки",
|
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"partial_translation": "部分翻译: {count}",
|
|
63
63
|
"format_mismatch": "格式不匹配: {count}",
|
|
64
64
|
"type_mismatch": "类型不匹配: {count}",
|
|
65
|
-
"structure_mismatch": "结构不匹配: {count}"
|
|
65
|
+
"structure_mismatch": "结构不匹配: {count}",
|
|
66
|
+
"same_as_source": "与源文件相同: {count}"
|
|
66
67
|
},
|
|
67
68
|
"keysToTranslate": "📋 待翻译键",
|
|
68
69
|
"key": "键",
|
package/ui-locales/zh/init.json
CHANGED
|
@@ -34,5 +34,9 @@
|
|
|
34
34
|
"frameworks.i18next": "- i18next (i18next)",
|
|
35
35
|
"frameworks.nuxt": "- Nuxt i18n (@nuxtjs/i18n)",
|
|
36
36
|
"frameworks.svelte": "- Svelte i18n (svelte-i18n)",
|
|
37
|
-
"selectOptionPrompt": "
|
|
37
|
+
"selectOptionPrompt": "选择选项:",
|
|
38
|
+
"existingDirectoriesFound": "📁 找到现有的翻译目录:",
|
|
39
|
+
"useExistingDirectoryPrompt": "使用现有目录?输入编号(或按回车键创建新目录):",
|
|
40
|
+
"usingExistingDirectory": "✅ 使用现有目录: {dir}",
|
|
41
|
+
"usingExistingStructure": "✅ 使用现有翻译结构: {dir}"
|
|
38
42
|
}
|