- Revert build system changes (outfile paths)
- Revert version bump to maintain current 3.23.4
- Fix flawed timezone test by replacing with consistent date formatting test
- Keep core time statistics feature intact
Language names in the settings dropdown are now displayed in their native
scripts rather than being translated to the current UI language. This follows
standard UX practices and provides better user experience.
Changes:
- Added `getNativeLanguageName()` method to I18nService
- Updated II18nService interface to include new method
- Modified settings dropdown to use native language names
- Updated language change notifications to use native names
Native language names (endonyms):
- English → English
- French → Français
- German → Deutsch
- Spanish → Español
- Russian → Русский
- Chinese → 中文
- Japanese → 日本語
Benefits:
- Users can instantly recognize their language regardless of current UI language
- Eliminates confusion when switching between languages
- Follows international UX standards
- More accessible for non-English users
The "System default" option remains translated to the current UI language
as it's a UI concept rather than a language name.
This commit includes two key improvements to the internationalization system:
1. **Fix "System default" language detection priority**:
- Now prioritizes Obsidian's configured language (getLanguage() API)
- Falls back to browser/system locale, then English
- Resolves issue where TaskNotes stayed in English even when Obsidian was set to other languages
- Added comprehensive documentation explaining the priority order
2. **Move i18n language settings to General tab**:
- Relocated UI Language section from Features tab to General tab
- More intuitive placement for core plugin configuration
- Maintains all functionality including real-time language switching
3. **Fix FilterBar tests for translation system**:
- Updated FilterBar.subgroups.test.ts to work with new translation system
- Added proper i18n mocks for test compatibility
- Tests now expect translated text ('Group' instead of 'GROUP')
The "System default" setting now works intuitively for Obsidian users:
- Before: Obsidian set to French → TaskNotes stays English (confusing)
- After: Obsidian set to French → TaskNotes uses French (expected behavior)
Files modified:
- src/main.ts: Enhanced getSystemUILocale() with proper priority order
- src/settings/tabs/generalTab.ts: Added UI Language section
- src/settings/tabs/featuresTab.ts: Removed UI Language section
- tests/unit/ui/FilterBar.subgroups.test.ts: Fixed i18n test compatibility
This commit resolves test failures caused by missing i18n translation
service mocks. The translation feature (PR #709) added internationalization
support but tests were failing due to undefined i18n.translate method.
Changes:
- Added comprehensive i18n mock to PluginFactory in mock-factories.ts
- Updated TaskCreationModal test files to include i18n mocks
- Fixed MigrationModal test constructor to include required plugin parameter
- Added translation key mappings for common test scenarios
Test Results:
- Before: 30 failing tests, 1112 passing
- After: 0 failing tests, 1142 passing ✅
All translation-related tests now pass successfully.
- Add complete German (de) translation with 1305 keys
- Add complete Spanish (es) translation with 1305 keys
- Add complete Japanese (ja) translation with 1305 keys
- Update i18n index to register new languages
- Update existing language files with new language entries
- Sync i18n manifest and state files
- All languages now have 100% translation coverage
Fixed translation issues in DueDateModal and ScheduledDateModal where users
were seeing raw translation keys instead of properly translated text.
**Issues fixed:**
- DueDateModal was using correct translation calls but keys didn't exist
- ScheduledDateModal had hardcoded English strings instead of translations
**Changes:**
- Added complete modals.dueDate translation section to all 4 languages
- Added complete modals.scheduledDate translation section to all 4 languages
- Replaced all hardcoded strings in ScheduledDateModal with translation calls
- Updated i18n manifest and state files (42 new translation keys: 1260 → 1302)
**Translation coverage:**
- English: Complete with proper accessibility labels and error messages
- French: Complete with proper French translations
- Russian: Complete with proper Russian translations
- Chinese: Complete with proper Chinese translations
Both modals now show fully translated text instead of keys like "modals.dueDate.Title"
DateContextMenu was showing raw translation keys instead of translated text
because the plugin instance wasn't being passed to the constructor. This
prevented the component from accessing the i18n service.
- Add plugin parameter to both DateContextMenu instantiations in TaskModal
- Fixes issue where keys like 'modals.dueDate.Title' appeared instead of translated text
- All required translation keys already exist in contextMenus.date section
Added imports for ru and zh translation resources to the i18n index file.
This resolves the issue where translation keys were appearing instead of
translated values in the UI, particularly in date modals.
- Import ru and zh translation modules
- Add ru and zh to translationResources object
- Ensures all 4 languages (en, fr, ru, zh) are available at runtime
Fixed unterminated string literals in Russian and Chinese translation files that were preventing npm run i18n:sync from working correctly. Both files had multiline strings that needed proper escaping with \n\n instead of literal line breaks.
- Fix syntax errors in src/i18n/resources/ru.ts webhook confirmation message and NLP placeholder
- Fix syntax errors in src/i18n/resources/zh.ts webhook confirmation message and NLP placeholder
- Update i18n manifest and state files
- All 4 languages (en, fr, ru, zh) now have 100% translation coverage with 0% stale entries
- Add i18n management script with sync, verify, and status commands
- Integrate GitHub Actions workflow to enforce translation consistency
- Generate initial manifest (1209 keys) and state files for English/French
- Add package.json scripts for easy i18n workflow management
- Create comprehensive I18N_GUIDE.md with usage examples and best practices
Features:
- Automatic detection of missing/stale translations
- CI/CD enforcement preventing deployment of untranslated strings
- Hash-based tracking system for source string changes
- Support for multiple locales with individual progress tracking
- TypeScript file parsing with automatic cleanup
This ensures translation quality and prevents regressions while providing
clear workflows for both developers and translators.
- Complete translation of features tab hardcoded strings
- Translate all webhooks modal hardcoded strings and notices
- Add comprehensive translation keys for data storage, notifications, performance settings
- Update webhook and subscription confirmation dialog structures for consistency
- Fix TypeScript compilation errors across 35+ files
- Add missing plugin parameters to FilterHeading and migration modal calls
- Update translation function signatures to support parameter interpolation
- Remove obsolete getTranslate() function references
- Ensure successful build with no TypeScript errors
This completes the comprehensive i18n implementation with 300+ translation keys
covering the entire UI in both English and French locales.
- Translate all remaining settings tabs with full English/French support
- generalTab.ts: Task storage, identification, folder management, interaction
- appearanceTab.ts: Task cards, filenames, display, calendar, UI elements
- defaultsTab.ts: Basic defaults, dates, reminders, templates, conversion
- taskPropertiesTab.ts: Statuses, priorities, field mapping, custom fields
- integrationsTab.ts: Bases, calendar, ICS export, HTTP API, webhooks
All settings are now fully internationalized following established i18n patterns.
Users can switch between English and French for complete UI translation.
- Add comprehensive translation keys for all remaining featuresTab.ts strings
- Translate notifications, sound, data storage, overdue, indexing, suggestions,
time tracking, recurring tasks, and timeblocking sections
- Update all hardcoded strings to use translation keys with French translations
- featuresTab.ts is now fully translated
Other settings tabs still need translation work.
- Fix DateContextMenu.ts to use translation keys for modal UI
- Translate recurrence options and context menu items in TaskContextMenu.ts
- Add subtask loading state translations in TaskCard.ts
- Begin settings translation work in featuresTab.ts (notifications, sound, storage)
- Add corresponding French translations for all new keys
Still need to complete remaining settings tab translations.
- Update normalizeTag to preserve slashes for hierarchical tags (e.g. #project/frontend)
- Update normalizeContext to preserve slashes for hierarchical contexts (e.g. @home/computer)
- Refactor both functions to eliminate code duplication
- Add comprehensive unit tests for both functions
- Document hierarchical subgrouping in filtering-and-views.md with demo GIF
- Add subgrouping section to task-list.md with usage examples
- Update agenda-view.md to reference subgrouping support
- Enhance features.md overview to mention two-level organization
- Include subgroups.gif demonstration of the feature in action
Provides complete documentation for the new hierarchical subgrouping
functionality that allows two-level task organization across views.
- Update AgendaView to use GroupingUtils.formatGroupName() for subgroup headers
- Ensures consistent priority display format: 'Low priority', 'Medium priority', etc.
- Eliminates discrepancy where AgendaView showed raw values while TaskListView showed formatted labels
- Both views now display identical priority subgroup names for better UX consistency
- Add HierarchicalGroupingService sorting tests
* Test "No <field>" positioning for ascending and descending order
* Verify type-aware sorting behavior for user fields
* Validate subgroup key ordering consistency
- Add FilterBar subgroup menu integration tests
* Test subgroup header and options in sort/group context menu
* Verify subgroup reset behavior when primary group changes
* Use dependency injection approach for reliable test execution
- Enhance test infrastructure for subgroup testing
* Implement direct method testing instead of DOM manipulation
* Add mock resolver functions for user field value resolution
* Create reusable test helpers for subgroup scenarios
Provides robust test coverage for subgroup sorting logic, menu integration,
and cross-view consistency to ensure reliable hierarchical grouping behavior.
- Add comprehensive subgroup sorting to HierarchicalGroupingService
* "No <field>" subgroups appear first in ascending order, last in descending order
* Implement type-aware sorting for user fields (number, boolean, date, text)
* Ensure consistent subgroup ordering across TaskListView and AgendaView
- Enhance group change responsiveness in FilterBar
* Group changes now trigger immediate view updates using emitImmediateQueryChange()
* Improve user experience with instant visual feedback for grouping changes
- Extend HierarchicalGroupingService.group() method
* Add sortDirection and userFields parameters for enhanced sorting capabilities
* Enable FilterService to pass sort context for proper subgroup organization
Delivers consistent and intuitive subgroup behavior with proper "No <field>"
positioning and immediate responsiveness to grouping changes.
- Introduce HierarchicalGroupingService for two-level grouping
- FilterService: add getHierarchicalGroupedTasks() returning { groups, hierarchicalGroups }
- TaskListView: render hierarchical groups when subgroupKey is active; expand/collapse all subgroups per primary; show per‑group counts using agenda-view__item-count; fallback to flat groups when no subgroup
- Keep ViewPerformanceService flow; maintain taskElements tracking and selective updates
- FilterBar: harden button rebuilding (guard empty() with fallback, use classList/add), minor cleanup of unused locals
- Styles and GroupingUtils updated to support subgroup sections
Notes:
Excludes AgendaView.ts and tests (Agenda subgroups not working yet; will follow in a separate commit)
Backward compatible when subgroupKey is not set (flat groups unchanged)