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 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 (2025-08-02) - **DOCUMENTATION & METADATA CLEANUP RELEASE** 🧹
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.1.5 for critical bug fixes and stability improvements.
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.1.5 for critical bug fixes and stability improvements.
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.1.5 for critical bug fixes and stability improvements.
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.1.5 – **PRODUCTION READY** with enhanced documentation and npm metadata cleanup! 🌍
3
+ **Version:** 1.2 – **PRODUCTION READY** with enhanced documentation and npm metadata cleanup! 🌍
4
4
 
5
- **⚠️ Important Notice:** All previous versions (< 1.1.5) 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.
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
- [![1.1.5](https://badge.fury.io/js/i18ntk.svg)](https://badge.fury.io/js/i18ntk)
9
+ [![version](https://badge.fury.io/js/i18ntk.svg)](https://badge.fury.io/js/i18ntk)
10
+ [![npm](https://img.shields.io/npm/dt/i18ntk.svg)](https://www.npmjs.com/package/i18ntk)
10
11
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
11
12
  [![Node.js Version](https://img.shields.io/badge/node-%3E%3D16.0.0-brightgreen.svg)](https://nodejs.org/)
12
13
 
13
- **i18ntk** (i18n Toolkit) is a comprehensive, enterprise-grade 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
+ **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 NOT an official i18n team product or affiliated with any i18n organization.** This toolkit was originally created as a personal project to help manage my own translation files, which was then enhanced with additional features, internationalization support, and made available to the community. It should work with any `en.json` translation files, even without i18n installed, and includes custom logic and settings that can be customized to fit your specific project needs. With simple code modifications or AI-assisted edits, you can easily adapt it to your project's requirements.
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 complete internationalization:
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
- **Features:**
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.0Enhanced CLI experience with proper version command and improved documentation! 🚀
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.
@@ -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 });
@@ -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.language')}`);
463
- console.log(`11. ${this.ui.t('menu.options.settings')}`);
464
- console.log(`12. ${this.ui.t('menu.options.help')}`);
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.language')}`);
487
- console.log(`11. ${this.ui.t('menu.options.settings')}`);
488
- console.log(`12. ${this.ui.t('menu.options.help')}`);
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 '12':
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 '13':
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
- // Add language change functionality
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) => {
@@ -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 with multiple source directory detection
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
- // Multiple possible source directories to check
38
- const possibleSourceDirs = [
39
- './main', // Primary source directory for this project
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 source directory
51
- let detectedSourceDir = './src'; // Default
52
- for (const dir of possibleSourceDirs) {
53
- if (fs.existsSync(dir)) {
54
- // Check if directory contains code files
55
- try {
56
- const files = fs.readdirSync(dir);
57
- const hasCodeFiles = files.some(file =>
58
- ['.js', '.jsx', '.ts', '.tsx', '.vue', '.svelte'].includes(path.extname(file))
59
- );
60
- if (hasCodeFiles) {
61
- detectedSourceDir = dir;
62
- break;
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
- // Multiple possible i18n directories
71
- const possibleI18nDirs = [
72
- './locales',
73
- './src/locales',
74
- './src/i18n',
75
- './src/i18n/locales',
76
- './app/locales',
77
- './app/i18n',
78
- './public/locales',
79
- './assets/locales',
80
- './translations',
81
- './lang'
82
- ];
83
-
84
- // Auto-detect i18n directory
85
- let detectedI18nDir = './locales'; // Default
86
- for (const dir of possibleI18nDirs) {
87
- if (fs.existsSync(dir)) {
88
- // Check if directory contains language subdirectories or JSON files
89
- try {
90
- const items = fs.readdirSync(dir);
91
- const hasLanguageDirs = items.some(item => {
92
- const itemPath = path.join(dir, item);
93
- if (fs.statSync(itemPath).isDirectory()) {
94
- return ['en', 'de', 'es', 'fr', 'ru', 'ja', 'zh'].includes(item);
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
- return item.endsWith('.json');
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: settings.directories?.sourceDir || detectedSourceDir,
110
- i18nDir: settings.directories?.i18nDir || detectedI18nDir,
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.5",
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.5",
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.1.5"
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.1.5", "1.0.x"],
143
- "nextVersion": "1.1.6",
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",
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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 ⚠️",
@@ -34,5 +34,9 @@
34
34
  "frameworks.i18next": "⚠️ TRANSLATION NEEDED ⚠️",
35
35
  "frameworks.nuxt": "⚠️ TRANSLATION NEEDED ⚠️",
36
36
  "frameworks.svelte": "⚠️ TRANSLATION NEEDED ⚠️",
37
- "selectOptionPrompt": "⚠️ TRANSLATION NEEDED ⚠️"
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
  }
@@ -11,7 +11,7 @@
11
11
  "workflow": "⚠️ TRANSLATION NEEDED ⚠️",
12
12
  "status": "⚠️ TRANSLATION NEEDED ⚠️",
13
13
  "delete": "⚠️ TRANSLATION NEEDED ⚠️",
14
- "language": "⚠️ TRANSLATION NEEDED ⚠️",
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 ⚠️",
@@ -34,5 +34,9 @@
34
34
  "frameworks.i18next": "⚠️ TRANSLATION NEEDED ⚠️",
35
35
  "frameworks.nuxt": "⚠️ TRANSLATION NEEDED ⚠️",
36
36
  "frameworks.svelte": "⚠️ TRANSLATION NEEDED ⚠️",
37
- "selectOptionPrompt": "⚠️ TRANSLATION NEEDED ⚠️"
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
  }
@@ -11,7 +11,7 @@
11
11
  "workflow": "⚠️ TRANSLATION NEEDED ⚠️",
12
12
  "status": "⚠️ TRANSLATION NEEDED ⚠️",
13
13
  "delete": "⚠️ TRANSLATION NEEDED ⚠️",
14
- "language": "⚠️ TRANSLATION NEEDED ⚠️",
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 ⚠️",
@@ -34,5 +34,9 @@
34
34
  "frameworks.i18next": "⚠️ TRANSLATION NEEDED ⚠️",
35
35
  "frameworks.nuxt": "⚠️ TRANSLATION NEEDED ⚠️",
36
36
  "frameworks.svelte": "⚠️ TRANSLATION NEEDED ⚠️",
37
- "selectOptionPrompt": "⚠️ TRANSLATION NEEDED ⚠️"
37
+ "selectOptionPrompt": "オプションを選択:",
38
+ "existingDirectoriesFound": "📁 既存の翻訳ディレクトリが見つかりました:",
39
+ "useExistingDirectoryPrompt": "既存のディレクトリを使用しますか?番号を入力(新規作成の場合はEnterを押してください):",
40
+ "usingExistingDirectory": "✅ 既存のディレクトリを使用: {dir}",
41
+ "usingExistingStructure": "✅ 既存の翻訳構造を使用: {dir}"
38
42
  }
@@ -11,7 +11,7 @@
11
11
  "workflow": "⚠️ TRANSLATION NEEDED ⚠️",
12
12
  "status": "⚠️ TRANSLATION NEEDED ⚠️",
13
13
  "delete": "⚠️ TRANSLATION NEEDED ⚠️",
14
- "language": "⚠️ TRANSLATION NEEDED ⚠️",
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": "⚠️ TRANSLATION NEEDED ⚠️",
61
- "empty_value": "⚠️ TRANSLATION NEEDED ⚠️",
62
- "partial_translation": "⚠️ TRANSLATION NEEDED ⚠️",
63
- "format_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
64
- "type_mismatch": "⚠️ TRANSLATION NEEDED ⚠️",
65
- "structure_mismatch": "⚠️ TRANSLATION NEEDED ⚠️"
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 ⚠️",
@@ -34,5 +34,9 @@
34
34
  "frameworks.i18next": "⚠️ TRANSLATION NEEDED ⚠️",
35
35
  "frameworks.nuxt": "⚠️ TRANSLATION NEEDED ⚠️",
36
36
  "frameworks.svelte": "⚠️ TRANSLATION NEEDED ⚠️",
37
- "selectOptionPrompt": "⚠️ TRANSLATION NEEDED ⚠️"
37
+ "selectOptionPrompt": "Выберите опцию:",
38
+ "existingDirectoriesFound": "📁 Найдены существующие каталоги переводов:",
39
+ "useExistingDirectoryPrompt": "Использовать существующий каталог? Введите номер (или нажмите Enter для создания нового):",
40
+ "usingExistingDirectory": "✅ Используется существующий каталог: {dir}",
41
+ "usingExistingStructure": "✅ Используется существующая структура переводов в: {dir}"
38
42
  }
@@ -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": "键",
@@ -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
  }
@@ -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": "🔧 调试工具",